2011-06-24 4 views
1

バス幅が32ビットのマシン上の物理メモリからCPUが1バイトおよびワードを読み取る方法を知りたいと考えました。しばらく検索した後、データバスのバイトに対応する4つの個別のメモリバンクのバンク活性化に影響を与えるために制御バスバイトイネーブル線が使用されることを述べる様々な情報源が出た。32ビットシステムで4バイト未満のデータを転送する

私は、4で割り切れるアドレスだけがアドレスバスに配置されることを理解します。しかし、すべての4バイトがデータバスに読み込まれた後、未使用のバイトの一部が破棄されますか?たとえば、32ビットのデータバスを持つCPUが、位置1で始まる単語を読み込むことにしたとします(データの整列のために、これは起こりそうにありません)。この単語を読む方法は、次のようになりますか?

  1. アドレスバスにアドレス0を配置します。
  2. 0,1,2,3のバイトをデータバスに配置します。
  3. 廃棄バイト0及び3(それぞれのビットをクリア)
  4. 再配列バイト1および2のデータバス上のバイト1は、第3のバンクにあるように、バイト2は、4バンクにある
  5. 発送データバス上の変更された値を、制御ユニット内に登録されたメモリデータに変換する。
+2

私は少なくとも「アーキテクチャに依存しています」と言わなければなりません*。 –

+0

@pstそれが役に立ったらx86だよ –

答えて

2

非常に多くのものがアーキテクチャの種類に依存します。そして、あなたはプロセッサバスを持っていて、他のサポートチップの反対側に、おそらくはドラマーやpcie、あるいは他のインターフェースも持っていて、独自のルールやニュアンスを持っています。チップに複数のインターフェースがある場合は、各インターフェースが異なる可能性があります。

最近では、あなたが説明するものの種類が表示されます。

たとえば、メモリまたは周辺システムはすべてが32ビットと同じくらい簡単で、プロセッサに近いメモリインターフェイスはペリフェラルまたはメモリが認識されずにバイトレーンを選択して操作できるため、読み込みよりも柔軟性があります。時には、私が心配しているのは、これらのバイトレーンと周りの周辺機器が、ダムで単純なものを選ぶことができ、ちょうど4バイトすべてをそこに置くか、または要求されたバイトを埋めて、または古くなったデータで駆動されるか、またはハイまたはローに駆動される。いくつかのシステムでは、データを右揃えまたは左寄せにする必要があります。そのため、アドレス0x01にバイトを格納する場合、メモリインターフェイスは結果バイトをエンディアンに応じて左端または右端のバイトレーンに配置します(この回答はx86のところで)。

書き込みが必要なのは、個々のバイトを書き込むことができる(システムが定義している)が許可されているシステムで、バスが32ビットの場合は、右または左に正当なものを持ち、アドレスを指定できますおよびサイズ。または、バイテランのことを行うことができ、両者は正しいバイトレーンからデータを選択する必要があります。書き込まれるペリフェラルは、この状況でリード・モディファイ・ライトを管理する必要があります(0x12345678を含む32ビット・メモリに書き込むと、0x02のバイトが0x12555678になるはずです。 0x12345678を読み取って1バイトを変更し、32ビットをメモリに書き戻します。

x86は、非常に厄介なプラットフォームです。非整合型のアクセスが可能です。メモリインターフェイスやペリフェラルがよりシンプルになります(ロジックが少なく、消費電力が少なく、パフォーマンス以外のすべてが少なくなります)。だから、あなたは依然として個々のバイトアクセス用のバイトレーンを持っていますが、アドレス0x01への32ビット書き込みは心配する必要はありません。これは通常x86で扱われます。たとえば、アドレス1に24ビット、 x86プラットフォームでは法的に問題はあるものの、アライメントが合っていないため、パフォーマンスが半減します。アライメントされた32ビットアクセスは、下位2ビットがゼロ(2からパワー2バイトまたは4バイト)の0x0、0x04、0x08、0x0c、0x10などのアドレスにしか存在しないことを意味します。16ビットアクセスは、パワー1境界、下位ビットがゼロのアドレス、0x0 0x02 0x04 0x06 0x08。 0x30 0x02 0x03 0x04など

いくつかのシステムでは、現在のところ、x86システムではどのように扱われているのですか?たとえば、DRAM(DDRなど) 、特にecc機能を備えたラムインターフェイスでは、メモリレイヤ自体では、完全なNビット量、たとえば64ビットのeccで8ビットのeccビットを計算する必要があるため、8ビットのeccで書き込むことができますすべての72ビットを一度に書き込むと、リードバックすると72ビットすべてが読み出され、チェックされます。良ければ、64データビットがユーザ/プログラムに戻ります。どのようにこれが正常に動作するかは、キャッシングのレイヤーを通してです。キャッシングの美しさの1つは、それがプロセッサーとより大きいメモリーシステムの間に位置することです。少なくとも読取りの場合、バイトを読み取ることが必要な場合がありますが、キャッシュは128ビット、またはキャッシュラインのサイズ(通常はメモリの一部の整数)を読み取ることがあります。そのキャッシュラインはキャッシュ内にとどまり、読み込んだバイトの隣にあるバイトに書き込むか、同じバイトでキャッシュ内のそのバイトを変更すると、最終的にメモリからそのデータを追い出す必要があるときに、メモリの効率的で効率的なユニット全体でキャッシュミスを伴うバイト書き込み、およびそのようなものは依然として読み取り - 変更 - 書き込みを伴う。

キャッシュシステムの有無にかかわらず、プロセッサ上のまたはそれに近いメモリインターフェイスは、リードモディファイライトを管理し、ペリフェラルまたはメインメモリがワードアライン方式(ワードが16または32または64ビット、そのメモリシステムがそのバスのサイズとして定義したもの)。

私は古いx86のピン配置を昨日見ていて、データとアドレスバスのいくつかが同じピンにあることを忘れていました。メモリサイクルとデータ部分にはアドレス期間があり、プロセッサと周辺機器はバスを管理するために指示を変更するか、少なくとも何らかの方法を使用する必要があります。ここでのポイントは、x86アーキテクチャーの歴史の中で変化し続けていることです。だから、アーキテクチャに固有のこの答えはx86だけに限定することはできません。ピン/パッドのレイアウトやそれに付随するチップセットに特化しなければなりません。また、ARMの寿命は変わっており、同じコアを異なるインタフェースオプション(AXI 32ビットまたはAXI 64ビットなど)で提供することもあります。

Dramはまた、プロセッサまたはキャッシュによって駆動されるアクセスの間に、誰かがどこかで常にメモリを使い続ける必要があるように、リフレッシュの複雑さを追加します。同様に、eccは、単一のビットエラーがある場合、理想的には、修正されたビットでライトバックを実行する必要があるという合併症を追加します。したがって、1バイトの読み込みでは、ソフトウェアの処理とは独立した32ビットの書き込みが発生する可能性があります。もし書き戻しの仕組みがなければ、eccの保護、パリティの使用、または使用しないことはかなり愚かです。

私が実際に慣れていないが、それがオープンコア全体で使用されているのを見るウィッシュボーンインターフェイスは、おそらくあなたが見て感じることができるものです。同様に、x86ファミリには、チップのエッジ上のメモリ/ I/Oインタフェースのタイミングを記述するハードウェアリファレンスマニュアルがあります。 ARMの場合、ambaとaxiのためにGoogleを使用できます。また、trmのテクニカルリファレンスマニュアル(武器のWebサイトから無料で入手できます)をキャッシュ用に入手すると、メモリインターフェイスの仕組みについてのいくつかの洞察を得ることができます。同様に、DDRピン配列と詳細は、ベンダーから、またはおそらくウィキペディアからでも入手可能でなければなりません。DDRとQDRは、半クロック・サイクルで起こったことを踏まえればさらに楽しくなります。伝統的には、クロック・サイクルごと、または複数クロック・サイクルごとにバスを変更しただけです。今はクロック・サイクルの途中で変化しており、メモリデバイスへのクロック出力とメモリデバイスからの別のクロックバックがあり、トレース長の損失を許容し、この半クロックサイクルの事柄を助けようとすることができる。それは、古いチップ(808x、6502、6800、z80、など)に戻ってメモリバスを見て、あなたの道を進んでいくのが簡単な、非常に面倒です。同様に、PCIまたはPCIeに飛び込む前にISAを見てください。

うわー、長い答え、それについて申し訳ありません、それは役に立ちます。

+0

@ dwelch-私の質問に答えてくれてありがとう、感謝してくれました。 –

関連する問題