2012-04-10 9 views
5

mmap関数を機能させることができません。 EINVALエラーコードが返されます。mmap()はEINVALを返します

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

私は私のプラットフォーム(ダーウィン)に、この機能のためにドキュメントをチェックしましたし、何か問題があるようには思えません。 mmapのマニュアルページには、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)の引数は、引数offset(map_offset)が0ので、それはページが整列しなければならないである8192

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

です。 (おそらく私は間違っていますか?)

+1

MAP_ANONでは、一部の実装ではfdを-1にする必要があります。チェックする価値があります。 –

+0

** @ Simon Elliott **はい、そうです。ありがとうございました。 –

答えて

2

最初の説明を読んだことはありますか?また、2つの互いに素例を説明するものとして読むことができます。MAP_FIXEDが指定され、addr引数が揃っページではなかった

  1. または所望のアドレス空間の一部は、ユーザプロセスの有効なアドレス空間の外に存在します。

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

私は(あなたが指定したアドレスがプロセスのアドレス空間に対するゆがんで行くかもしれないCOS)重大な理由がありますまで、あなたの mmaped地域を配置する addr引数に NULLを使用して実装に完全な自由を与えることを示唆している
0

ないようにそうでなければ行います。

+0

テストとして、私は 'NULL'を使って試しました。それでも「EINVAL」を返します。 –

+0

@NickBrooksあなたのシステムでPAGE_SIZEをテストできますか? –

関連する問題