Не удается сопоставить физическую память через /dev/mem, несмотря на то, что MAP_SHARED, CONFIG_STRICT_DEVMEM не установлен и nopat
Я пытаюсь получить доступ к физическому адресу через /dev/mem
безуспешно. Я могу получить доступ к адресному пространству, зарезервированному для устройств PCI, но при попытке отобразить свою память я получаю сообщение об ошибке. (Я сопоставил виртуальное и физическое через интерфейс pagemap).
Я добавил nopat в командную строку ядра и запускаю программу от имени пользователя root.
- виртуальный адрес: 0x7f925a266000
- физический адрес: 0x1d3a66000
Я также пытался выровнять его по огромным границам страницы без успеха.
Используя следующий код, mmap
возвращает -1.
int *addr;
if ((fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0 ) {
printf("Error opening file. \n");
close(fd);
return (-1);
}
addr = (int *)mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0x1d3a66000);
//error message: Operation not permitted, no logs with dmesg
printf("addr: %p \n",addr);
printf("addr: %d \n",*addr); /* CRASH. */
Любые идеи о том, как я могу заставить это работать, или если это невозможно через /dev/mem
Есть ли другой способ сопоставить физические адреса? Я использую Ubuntu с последней версией ядра.
Изменить: Я перекомпилировал ядро без strict_devmem, как предложено @yano, и проблема исправлена.