2012-02-11 11 views
1

メモリ(RAM、ハードディスク)からシングルビットを読み取ろうとしています。私の理解は、1バイト未満を読むことはできませんでした。 しかし、私はそれがアセンブリで行うことができることを伝える人を読んでいます。 私は帯域幅の使用率をできるだけ低くする必要はなく、取得するデータはシーケンシャルではないため、バイトを読み取って8ビットに変換することはできません。メモリからビットを読み取る

+0

「データは連続していない」とはどういう意味ですか? –

+0

私はメモリ上のさまざまな場所からビットを選び、ビット列を読むことはできません。 – RobotRock

+0

したがって、*アクセス*は順不同です。 –

答えて

4

私は、CPUがRAMからのキャッシュラインのサイズ(最近のIntelチップでは64バイト)を読み込むとは思っていません。ディスクから、最小値は通常4kBです。

データバスがそれよりはるかに広いので、一度に1ビットずつ読むことも可能でもなくても必要ありません。

+0

道の良い答え:-) – cnicutar

1

私が知っているすべてのPCまたはハードディスクから1バイト未満を読み取ることはできません。たとえできたとしても、非常に非効率です。

一部のマシンでは、ポートに1バイト未満の読み取り/書き込みが可能なメモリマップドポートを実行しますが、少なくとも1バイトとして取得しても表示されます。

のように特定のビットを狙い撃ちするビット演算子を使用する:あなたは、それがために使用

char someByte = 0x3D; // In binary, 111101 
bool flag = someByte & 1; // Get the first bit, 1 
    flag = someByte & 2; // Get the second bit, 0 
// And so on. The number after the & operator is a power of 2 if you want to isolate one bit. 
// You can also pick off several bits like so: 
int value = someByte & 3; // Assume the lower 2 bits are interesting for some reason 
0

メモリは、ビット幅だっ386/486日、1ビットずつ1メガを言うが、バス上のビットレーンごとに1つずつ、8つまたは複数のチップがあり、バスの幅だけを読み取ることができます。今日のメモリは1バイト幅で、32または64またはそれらの倍数の単位でしか読み取ることができません。バイトを読み込んだ場合でも、ほとんどのデザインはバイト全体を埋めます。それはメモリの途中でバスを隔離するために不必要に複雑化/コストを追加します。システムの大部分は32または64ビットの読み込みと見なされ、プロセッサのエッジに近づきます。チップ内のコアのエッジ)は、個々のバイトレーンが分離され、他のビットが破棄されるときです。キャッシュをオンにすると、メモリからの割り切り可能な最小の読み取りサイズが変更され、バーストまたはブロックの読み取りが表示されます。

8ビット幅のメモリシステムを設計し、一度に8ビットずつ読み込むことは可能ですが、なぜでしょうか?あなたがおそらく2ギガバイトのメモリで8ビットを利用することができなかった8ビットプロセッサでない限り。ドラマはとにかく133 mhzのようにかなり遅いです(たとえあなたの1600 MHzのメモリでも、遅い部分から読み取ると短くバーストし、メモリは10年以上で高速化していません)。

ハードディスクは似ていますが、セクタは最小の割り切れる単位だと思います。あなたはそれらの単位を読み書きする必要があります。読んでいるときには、プロセッサ上でメモリサイクルがあり、メモリに行くことと違いなく、読み込みを行う前、または結果としてセクタがディスクからバッファに読み込まれます。キャッシュラインを読み取ると、ディスクコントローラ内のバッファへのメモリサイクルによってバス幅が読み取られ、プロセッサがそれを分割するか、またはバスが複雑になり、バイトレーンを分離すると、ビットレーンが分離されません。 (私は誰も言わず、誰かが例外を返すだろうと...)

このほとんどは十分に文書化されており、見つけにくいものではありません。アームプラットフォームの場合、自由にダウンロードされたambaおよび/またはaxiの仕様を探します。ブリッジの数、pcieコントローラ、ディスクコントローラのドキュメントはすべてPCや他のプラットフォームで利用できます。それはアドレスとデータバス、または1つのgooutaと1つのgointaデータバスと、アクセスタイプを示すいくつかの制御信号にまで沸騰します。一部のバスはバイトレーンイネーブルを持っています。これは一般にリードではなくライト用です。現代の64ビットシステムでは、1バイトだけをドラムに書きたいと思っていれば、誰にでも私が書いたいものをほとんどすべてドラムに伝えなければなりません。一度に64ビットにアクセスしなければならないメモリモジュールにバイトを書き込むには、最低でも64ビットの読み出しがキャッシュまたはメモリコントローラの一時的な場所に発生し、書き込み対象のバイトが64ビットワードである場合、その64ビット量は最終的にメモリモジュール自体に書き戻される。これは、アドレスビットと少数の制御信号の組み合わせを使用して行うことができます。または、8バイトのレーンイネーブルを入れるだけで、下位アドレスビットを無視することができます。ハードディスクも同様にセクタを読み込み、1バイトを変更してから、一度にセクタ全体を書き込む必要があります。フラッシュとeepromで、あなたはゼロ(プログラマの視点から)を書くことができます。プログラマの観点からは、実際にはゼロであり、反転があります。書き込みは、セクタでなければなりません。セクタは64バイト、128バイト、256バイトにすることができます。

関連する問題