2015-11-09 2 views
0

Я сопоставляются два анонимных страниц в памяти, а затем получить доступ ко второй странице, как показано ниже:mmaping несколько анонимных страниц с

int* map = mmap(NULL, 8 * 1024, PROT_READ, PROT_WRITE, MAP_SHARED | 
        MAP_ANONYMOUS, -1, 0); 
    int a = map[4096]; 

, где размер страницы равен 4096 (я проверил это), но это бросает SIGSEGV. Я попытался использовать madvise(map, 8 * 1024, MADV_WILLNEED) и использовать флаг MAP_POPULATE в mmap, но это не помогло. Что я могу сделать, чтобы сделать эту работу?

+0

Какой размер 'int' в вашей среде? Вы выделили 8K * байты *, но если 'int' шириной не менее 2 байтов, 'map [4096]' будет пройденной отметкой 8 КБ. –

+0

Это была моя проблема. Я обратился к нему в своем ответе, но не видел вашего ответа, поскольку страница не обновилась. – user3148225

ответ

1

Этот вопроса я объявил map как int*, поэтому ссылки map[4096] искали значение на месте map + 4 * 4096, предполагая, что int s имеет длину 4 байта, и это, очевидно, вне диапазона я зарезервированный с mmap.

Смежные вопросы