-1

2 つのプロセス間でメモリを共有したい。
の後mmap()、アドレスを取得し、 mapStartオフセットを追加しmapStartて取得mapAddrし、mapAddrマップされた PAGE_SIZE を超えないようにします。までに
書くときmapAddr

memcpy((void *)mapAddr, data, size);

全て大丈夫。

しかし、私が読んだmapAddrとき

memcpy( &data, (void *)mapAddr, size);` 

その場合、システムがクラッシュします。
誰がなぜ知っていますか? 同様の問題はここにあります

情報を追加: @Tony Delroy、@J-16 SDiZ
mmap 関数は次のとおりです。

mapStart = (void volatile *)mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, memfd, pa_base);

システム クラッシュ: OS エラー メッセージは表示されません。コンソールにMCA情報が出力されます

ここに記載されている詳細

4

2 に答える 2

1

少なくとも 2 つの問題が考えられます。

mmap() の後、アドレス mapStart を取得し、次に mapStart にオフセットを追加して mapAddr を取得し、mapAddr がマップされた PAGE_SIZE を超えないようにします。

マッピングされたサイズを超えないmapAddrようにする必要がありますが、mapAddr+size. 1つだけでなく、バ​​イトに触れようとしてsizeいます。

memcpy((void *)mapAddr, data, size);
memcpy( &data, (void *)mapAddr, size);

が配列でないと仮定するとdata(最初の行でアドレス演算子なしで使用するため、これはもっともらしい仮定です)、2 行目は data指す場所からではなく、data からコピーします。これはおそらく、割り当てられていないメモリ、またはスタック上の場所などです。スタックに多くない場合は、スタックの末尾を越えてテキスト セグメントに読み込んだり、他の何かに読み込んだりすることもできます。

(dataが実際に配列である場合、もちろん同等ですが、コード スタイルに一貫性がなくなります。)

于 2012-07-02T09:19:30.953 に答える
1

ちょっとしたアイデア。

mmap()異なる属性を持つメモリ領域にまたがっていますか? これは違法です。古いカーネル (2.6.18 と言った) ではこれが許可されていましたが、その一部に書き込むとクラッシュします。

いくつかの出発点については、この投稿を参照してください。可能であれば、新しいカーネルを試してください。

于 2012-07-02T08:53:50.363 に答える