5

mmap関数が機能しません。EINVALエラー コードを返します。

void* mapped = 
        mmap((void*)(map_addr + slide),
             map_size,
             PROT_WRITE | PROT_READ,
             MAP_PRIVATE | MAP_ANON,
             bprm->file,
             map_offset);

私のプラットフォーム ( Darwin ) でこの関数のドキュメントを確認しましたが、問題はないようです。mmap の man ページには、EINVAL が返される 4 つのケースが示されています。

 [EINVAL]           MAP_FIXED was specified and the addr argument was not page
                    aligned, or part of the desired address space resides out of the
                    valid address space for a user process.

MAP_FIXED が指定されていないので、これではありません。

 [EINVAL]           flags does not include either MAP_PRIVATE or MAP_SHARED.

MAP_PRIVATE が存在します。

 [EINVAL]           The len argument was negative.

呼び出し時の len (map_size) 引数は 8192 です。

 [EINVAL]           The offset argument was not page-aligned based on the page size as
                    returned by getpagesize(3).

オフセット引数 (map_offset) は 0 であるため、ページに揃える必要があります。(たぶん私は間違っています?)

4

2 に答える 2

2

最初の説明を読んでよろしいですか? これは、2 つのバラバラなケースを説明していると解釈することもできます。

  1. MAP_FIXED が指定され、addr 引数がページ位置合わせされていない。
  2. または、目的のアドレス空間の一部が、ユーザー プロセスの有効なアドレス空間の外にあります。

このように読むと、map_addr + slide式の実際の値が面白くなります。

于 2012-04-10T12:42:44.693 に答える
0

引数に使用NULLaddr、実装にリー​​ジョンを配置する完全な自由を与えることをお勧めしますmmaped(指定したアドレスは、プロセスのアドレス空間に関してうまくいかない可能性があります)。

于 2012-04-10T12:44:41.387 に答える