0

Linuxのテストケースを見ました。mmap次のようにテストします。

#define HIGH_ADDR       (void *)(0x1000000000000)
addr = mmap(HIGH_ADDR, map_sz, PROT_READ,
                MAP_SHARED | MAP_FIXED, fildes, 0);

その場合、PPC64で、期待される結果はerrnoを取得しますENOMEM
しかし、PPC64での実際の結果はerrnoになります。とにかく、それはX86_64arch でうまく機能します。PPC64に十分なメモリが割り当てられていない可能性があります。だから、私はの定義を次のように変更しようとします: しかし、それでも。 PPC64用のLinuxが彼のメモリをどのように管理しているかを知りたいだけです。つまり、ユーザースペースプログラムのメモリ地理を知りたいのです。または、MAXアドレスは何を使用する必要がありますか。Invalid argument
HIGH_ADDR
#define HIGH_ADDR (void *)(0x7FFFFFFFFFF)
Invalid argument

4

2 に答える 2

2

差出人man 2 mmap

       EINVAL addr、length、またはoffsetは好きではありません(たとえば、大きすぎる、
              またはページ境界に位置合わせされていません)。

       EINVAL(Linux 2.6.12以降)の長さは0でした。

       EINVALフラグにMAP_PRIVATEもMAP_SHAREDも含まれていないか、含まれている
              これらの値の両方。

したがって、大きすぎる場合はmmapエラーを通知します。したがって、これは予想される動作です。EINVALaddr

推奨事項:MAP_FIXED本当に正当な理由がない限り、を使用しないでください。

脚注:すべての64ビットアーキテクチャが64ビットアドレスをサポートしているわけではありません。

于 2012-08-28T05:47:25.670 に答える
2

このMAP_FIXEDように使用することは無効です。それが機能したとしても、ロードされた共有ライブラリやダイナミックリンカなど、壊したくないものの上にマッピングされる可能性があります。使用する唯一の安全な方法MAP_FIXEDは、プログラムにすでに割り当てられているアドレス範囲の上にマップすることです(たとえば、mmapなしへの事前の呼び出しによってMAP_FIXED)。

于 2012-08-28T05:51:58.780 に答える