9

mmapの仕様に混乱しています。

mmappaのリターンアドレスとする(仕様と同じ)

pa = mmap(addr, len, prot, flags, fildes, off);

私の意見では、関数呼び出しが成功した後、次の範囲が有効です

[ パ、パ+レン )

私の質問は、次の範囲がまだ有効かどうかです。

[ round_down(pa, pagesize) , round_up(pa+len, pagesize) )
[ base, base + size ] 略して

つまり、次のようになります。

  1. base常にページ境界に配置されていますか?
  2. 常にページサイズのsize倍数ですか(つまり、粒度はページサイズです)?

ご協力いただきありがとうございます。

この段落で暗示されていると思います:

off引数は、_SC_PAGESIZE または _SC_PAGE_SIZE が渡されたときにsysconf()によって返される値に従って位置合わせおよびサイズ設定されるように制約されます。MAP_FIXED が指定されている場合、アプリケーションは、引数addrもこれらの制約を満たしていることを確認する必要があります。実装は、ページ全体でマッピング操作を実行します。したがって、引数 len はサイズまたはアラインメントの制約を満たす必要はありませんが、実装では、範囲 [pa,pa+len) で指定された部分ページをすべてのマッピング操作に含める必要があります。

しかし、よくわかりませんし、POSIX の経験もあまりありません。

  • もっと明確決定的な証拠を見せてください
  • または、POSIX をサポートし、動作が異なるシステムを少なくとも 1 つ表示してください。

ありがとうございます。

4

1 に答える 1

4

mmap には多くの異なるモードと構成があることを考えると、あなたの質問はかなり自由ですが、最も重要な点をカバーしようとします。

ファイルをメモリにマッピングする場合を考えてみましょう。ファイル内のデータの先頭は、常に mmap() の戻りアドレスにルートされます。オペレーティング システムが実際にページ境界でマップを作成した可能性がありますが、POSIX 標準では、OS がこのメモリを書き込み可能にする必要があるとは思いません (たとえば、必要に応じてこれらの領域でセグメンテーション違反を強制することができます)。ファイルをマッピングする場合、この追加のメモリ アドレス領域がファイルによってバックアップされるのは意味がありません。これらの領域が未定義である方が理にかなっています。

ただし、MMAP_ANONYMOUS の場合、メモリはおそらく書き込み可能ですが、このメモリを使用するのは賢明ではありません。

さらに、mmap() を使用しているときは、実際には glibc のバージョンの mmap() を使用しているため、適切と思われる方法でメモリを切り刻む可能性があります。最後に、POSIX 準拠の OSX では、提示された引用テキストはいずれも mmap() のマニュアル ページに表示されないことに注意してください。

于 2010-08-02T02:38:15.237 に答える