Не удается сопоставить физическую память через /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, и проблема исправлена.

0 ответов

Другие вопросы по тегам