При доступе к адресу mmap был получен сигнал SIGBUS - PullRequest
1 голос
/ 04 марта 2020

Когда я пытался получить доступ к возвращенному адресу 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, нет проблем.

1 Ответ

1 голос
/ 05 марта 2020

Я исправил это. Это проблема, которую легко не заметить. Космическое крепление для dev слишком мало ... так что ... вы знаете ....

...