Когда я пытался получить доступ к возвращенному адресу mmap, произошла ошибка шины.
Мой код указан ниже:
ftruncate(fd, shared_size);
addr = mmap(shared_start, shared_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);
shared_size == 256 *1024* 1024
shared_start == 401000000000 (я использовал флаг MAP_FIXED)
обрезать файл до 256M.
-rw-r--r-- 1 root 0 256.0M Mar 4 03:47 mem.alloc
Нет ничего плохого при вызове mmap, и не весь диапазон адресов не разрешен доступ. Из приведенной ниже информации о GDB видно, что адрес 0x40100f11ff00 не разрешен, но адрес 0x40100fe00000 разрешен:
(gdb) p *((char *)addr+0xf11ff00)
Cannot access memory at address 0x40100f11ff00
(gdb) p *((char *)addr+0xfe1ff00)
Cannot access memory at address 0x40100fe1ff00
(gdb) p *((char *)addr+0xfe00000)
$17 = 0 '\000'
Из приведенной ниже информации о картах видно, что все адреса, к которым я обращался выше, находятся в пределах диапазона. адреса mmap:
0x401000000000 0x401010000000 0x10000000 0x0 /dev/mem.alloc
Однако при записи этих недоступных адресов возникает ошибка шины: программа получила сигнал SIGBUS, ошибка шины.
PS. При уменьшении shared_size с 256M до 128M, нет проблем.