1

要求されたマッピング アドレスはページ開始ですが、数ページ分シフトされたアドレスが使用されます。

私はこのようなことをしようとしています:

char *mapped = mmap(base, page_size, PROT_NONE, MAP_SHARED,
                    file_handle, 0);
printf("Base  : %p\n", base);
printf("Mapped: %p\n", mapped);

出力例 ( page_size= 4096= 0x1000):

Base  : 0x7f22a1047000
Mapped: 0x7f22a1045000

オフセットは 2 ページです。これも によって異なるようlengthです。たとえば、1 ページではなく 4 ページをマップしようとすると、出力は次のようになります。

Base  : 0x7fd24d994000
Mapped: 0x7fd24d98f000

これは 5 ページのオフセットです。

なぜこのように振る舞うのですか?

4

1 に答える 1

2

OS は、固定アドレスでのマッピングを特に要求しない場合は、OS にとって都合のよいアドレスを自由に選択できるためです。mmap(2) の man ページから:

MAP_FIXED
          Don't interpret addr as a hint: place the mapping at exactly that
          address.  addr must be a multiple of the page size.  If the memory
          region specified by addr and len overlaps pages of any existing
          mapping(s), then the overlapped part of the existing mapping(s) will be
          discarded.  If the specified address cannot be used, mmap() will fail.
          Because requiring a fixed address for a mapping is less portable, the
          use of this option is discouraged.

その正確なアドレスが必要ない場合は、システムに選択させる方がよいでしょう (正直なところ、ほとんどの場合はそうなるはずです)。

于 2012-08-19T10:47:03.730 に答える