Mmap не использует данный адрес

Хотя запрошенный адрес сопоставления является началом страницы, он будет использовать адрес, сдвинутый на несколько страниц.

Я пытаюсь сделать что-то вроде этого:

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. Например, если вместо одной страницы я попытаюсь отобразить 4 страницы, вывод будет таким:

Base  : 0x7fd24d994000
Mapped: 0x7fd24d98f000

что составляет 5 страниц смещения.

Почему оно так себя ведет?


person Iulius Curt    schedule 19.08.2012    source источник


Ответы (1)


Потому что ОС, когда специально не запрашиваешь маппинг по фиксированному адресу, вольна выбирать удобный для себя адрес; со страницы руководства mmap(2):

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.

Если вам не нужен этот точный адрес, лучше позволить системе выбрать его (что, честно говоря, должно быть в большинстве случаев).

person tbert    schedule 19.08.2012
comment
Спасибо. Я как-то проглядел этот флаг. - person Iulius Curt; 19.08.2012