2016-08-19 6 views
2

Мне присвоен физический адрес, в частности 0x000000368d76c0. Я пытаюсь сделать mmap в моей программе. Код, который я используюПочему mmap не работает?

void *mmap64; 
off_t offset = 0x000000368d76c0; 
int memFd = open("/dev/mem", O_RDWR); 
if (-1 == memFd) 
    perror("Error "); 

mmap64 = mmap(0, sizeof(uint64_t), PROT_WRITE | PROT_READ, MAP_SHARED, memFd, offset); 
if (MAP_FAILED == mmap64) { 
    perror("Error "); 
    return -1; 
} 

По какой-то причине, когда я запускаю этот код я получаю отказ от mmap. В частности, он говорит Error Invalid argument. Я уверен, что это из-за значения offset, но я не знаю, что с ним не так.

Я был бы признателен за любую помощь по этому вопросу.

+0

Вы имеете в виду 'address' by' adddress' в аргументах 'mmap()'? – MikeCAT

+0

@MikeCAT Я имею в виду аргумент 'offset'. – flashburn

+7

[mmap (2) - Страница руководства Linux] (http://man7.org/linux/man-pages/man2/mmap.2.html) говорит: «' offset »должно быть кратным размеру страницы, как было возвращено 'sysconf (_SC_PAGE_SIZE)'». Какая ценность в вашей системе? Ссылка: [sysconf (3) - страница руководства Linux] (http://man7.org/linux/man-pages/man3/sysconf.3.html) – MikeCAT

ответ

3

Согласно mmap(2) - Linux manual page,

offset должно быть кратным размеру страницы, как , возвращенного sysconf(_SC_PAGE_SIZE).

Когда размер страницы 4096 (размер страницы используется в x86 CPU), 0x000000368d76c0 не является кратным 4096 и будет считаться недействительным.

По этой причине вам необходимо будет отрегулировать смещение.

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

  • Нет связанных вопросов^_^