2

2 つのプロセスがあり、それぞれがから同じshmidshmget()ものを取得できます。

これら 2 つのプロセスでshmat()は、異なるメモリ アドレスを指定します。

各プロセスのアドレスは常に同じです。

Process1: 0x41b31000
Process2: 0x4017d000

以下の質問に書かれている答えが述べられているように、アドレスは仮想アドレスではないと思います。また、これらのアドレスが仮想アドレスである場合、これらは同じハードウェアアドレスを指している必要があります。ただし、これらのアドレスの内容は同じではありません。

私は ARM プロセッサ用にクロス コンパイルしています。私のプログラムは、x86 Debian Lenny でエラーや問題なく実行されています。

私はその質問を認識していますが、問題はそれほど簡単ではありません-shmat()は同じ「shmkey」に対して別の「shmaddr」を返しています-

4

2 に答える 2

4

によって返されるアドレスshmatは仮想アドレスです。

同じ物理メモリが、異なるプロセスの異なる仮想アドレスにマップされる場合があります。(同じ物理メモリが 1 つのプロセス内の異なる仮想アドレスにマップされることさえ可能です。オペレーティング システムは、複数の仮想アドレスが同じ物理メモリにマップされるように、仮想から物理への変換を設定できます。)

処理中のアドレスを返し、同じ共有メモリ セグメントのマッピングが処理中のshmatアドレスを返す場合、処理中のデータは処理中のデータと同じである必要があります。そうでない場合は、次のような問題があります: 同じ共有メモリ セグメントを実際にマップしていない、データを正しく比較していない、または (ほとんどありませんが) 共有メモリ ソフトウェアまたはオペレーティング·システム。aAbBaAbB

于 2013-03-29T11:32:36.847 に答える
0

メモリアラインメントについてでした。

クリーンかどうかに関係なく、1バイトから始まる巨大なデータがありますが、その1バイトは2週間かかります。

ARM またはオペレーティング システムの共有メモリには問題はありません。

理由は一つ、私のせいです。

于 2013-03-30T12:39:02.147 に答える