3

多くの CPU アーキテクチャ (ARM、PPC) は奇数アドレスを読み取ることができないが、強制すると例外が生成されることはよく知られています。(x86)

しかし、フル 32 ビット (またはそれ以上!) のワードしかアドレス指定できない CPU はありますか? つまり、16 ビット ワードをアドレス指定できないのでしょうか。おそらくamd64?

ポータブルでありながら高速な C の malloc のようなアロケータを作成しようとしており、メモリ アクセスを適切に調整したいと考えています。現在、私はARM、i386、およびamd64をターゲットにしています。これらの特性を調べることはできましたが、目を光らせておくとよいと思いました。

私の質問をする具体的な方法は次のようになると思います。

アドレス 0x2 から 16 ビットを読み取る CPU はありますか (0 に近いアドレス範囲が一般的に有効であるという議論のために、一部の CPU は最初のページを使用しないことがわかっています)、バス エラーが発生します。ここで、CPU = MIPS、ARM、x86、amd64、68k、88000、SH、OpenRISC、Sparc、PPC、Cell/SPE のいずれか?

(ちなみに、私はこの全体を C プログラマーの観点から見ています。したがって、C コンパイラーは、char や uint32_t などの通常の C 型をすべて提供してくれると思います。)

4

3 に答える 3

2

Cell の SPE には 16 バイトのクワッド ワード ロード/ストアしかなく、それらは 16 バイト境界に揃える必要があります。

より細かい粒度で対処する必要がある場合は、読み取り-変更-書き込みを行い、ビットマスクを使用してデータの関連部分のみを更新する必要があります。

明らかに、C/C++ ではコンパイラがそれを支援し、マスクの生成と使用は命令セットでサポートされています。

アドレス「2」から16ビットを読み取る例では、アドレス「0」から128ビットを読み取り、必要なビットをマスクする必要があります。アドレス '2' に 16 ビットを書き込みたい場合は、最初に 128 ビットすべてを読み取ってから、適切な 16 ビットを更新し、すべてを書き戻す必要があります。

于 2012-12-13T23:24:34.650 に答える
2

初期の IBM Power プロセッサーの一部は、項目サイズの境界でのみ読み取り/書き込みを行うことができましたが、トラップ (例外) ハンドラーを使用して位置合わせされていないデータを処理していました。(そして、「OK」と言って、アドレスの下位ビットを無視して、整列されたワードの内容を静かに提供する初期バージョンも1つあったと思います。)

古い IBM 7000 シリーズのボックスでは、36 ビット境界 (ワード サイズ) でフル ワードの読み取り/書き込みしかできませんでした。しかし、低/高ハーフワード操作の読み取り/書き込みがあったと思います。

HP 2100 シリーズのプロセッサ IIRC は、ワード (16 ビット) アドレスしか持っていませんでしたが、バイト インデックスを作成できました。ただし、インデックスはバイト操作のバイト インデックスとしてのみ解釈されました。それ以外の場合は、単語インデックスでした。

ただし、malloc のアライメントに関しては、通常、キャッシュ ラインの境界でアライメントする必要があります。そうしないと、MP 環境でキャッシュのスラッシングを防ぐのは困難です。

于 2012-12-13T23:22:48.997 に答える
0

16 ビットの量をアドレス指定できる場合は、16 ビット アラインされた量を確実に読み取ることができます。おそらく、バイトアドレス指定可能なアドレス空間があると想定していると思います。できない場合がありますので、注意が必要です。特定の (そして現在の) 例はわかりませんが、一部のアーキテクチャ (特定の組み込み型) がバイトまたは 16 ビットでさえもアドレス指定できない可能性があることは間違いなく考えられます。

それは実際に問題ですか?たまたまワード アドレス指定が可能なマシンを使用している場合、アドレス指定可能なワード サイズが 32 ビットの場合、実際には 16 ビットのみをアドレス指定することはできません。ただし、sizeof には注意してください。

あなたは amd64 (x86-64) について尋ねました。メモリ アライン アクセスに制限はありませんが、アラインされていないアクセスのためにサイクルを失う可能性があります。整列されていないアクセスは決して移植可能ではないことに注意してください。

更新: アラインされたアドレスとは何ですか?

タイプ T のアラインされたアドレスは、sizeof(T) の倍数である任意のアドレスです。ここで、sizeof(T) は、値が占めるアドレス指定可能な単位の数です。たとえば、バイト アドレス指定可能な空間に 32 ビットのワード サイズがある場合、アラインされたアドレスは少なくとも 4 の倍数ごとになります。ただし、マシンが 16 ビット単位でアドレス指定できる場合は、 2 は、32 ビット量のアラインされたアドレスになります。

16 ビット量を読み取る場合、次の 3 つのケースがあります。

  1. バイト アドレス指定: 奇数アドレスは位置合わせがずれている可能性があります。アーキテクチャは、これらを整列したものとして自由に扱うことができますが、そうではありません。
  2. アドレス可能な単位は 16 ビットです。すべてのアドレスは 16 ビット量に合わせて調整されます。
  3. アドレス可能な単位はより大きく、実際には 16 ビットの量はありません。彼らは静かに大きくなっています。

更新 2: アドレス 0x2 から 16 ビットを読み取る CPU はありますか (アドレス範囲が有効であると仮定して)、バス エラーが発生しますか?

アドレス可能単位が 8 ビット未満でない限り、そのような CPU は存在しません。その理由は、アドレス 0x2 のアラインメントが 2 つのアドレス可能単位であるためです。アドレス指定可能な単位が 8 ビットの場合、16 ビットで整列されます。

さらに、16 ビットという意図により、アドレス可能なユニット サイズの奇妙な値は除外されます。16 ビット値がアーキテクチャの実数である場合、アドレス指定可能な単位は 16 の因数でなければなりません。したがって、1、2、4、8、または 16 ビットしかあり得ません。それがたまたま高い場合、アライメントは自明に満たされます。

8 ビット未満をアドレス指定するアーキテクチャは問題に値しないため、アドレス 0x2 が 16 ビット量のアライメントされたアドレスになることはほとんど保証されています。

于 2012-12-13T22:28:26.933 に答える