mmap: операция не разрешена - PullRequest
5 голосов
/ 21 ноября 2011

Я пытаюсь использовать mmap в пространстве пользователя для чтения физической памяти, с которой начинается mem_map. Это массив, который содержит все физические страницы. Это машина i386 с ядром 3.0.

Код такой:

....

//define page size
//
#define PAGE_SIZE 0x1000 //4096 bytes
#define PAGE_MASK (PAGE_SIZE - 1)

....

  /* open /dev/mem file*/
  if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) {
        printf("/dev/mem could not be opened.\n");
    perror("open");
        exit(1);
  } else {
    printf("/dev/mem opened.\n");
  }

  /* Map one page */
  printf(" mem_map is at physical addr: 0x%x\n", mem_map_phy_addr);

  map_base = mmap(0, PAGE_SIZE, PROT_READ, MAP_SHARED, fd, (mem_map_phy_addr & ~PAGE_MASK)); //mem_map_phy_addr is at 0x356f2000

  if(map_base == (void *) -1) {
    printf("Memory map failed. err num = %d\n",errno);
    perror("mmap"); //failed here
  } else {
    printf("Memory mapped at address %p.\n", map_base);
  }

Я запустил это как корень. Выход:

/dev/mem opened.
 mem_map is at physical addr: 0x356f2000
Memory map failed. err num = 1
mmap: Operation not permitted

Чтобы быть уверенным, я погуглил проблему и добавил следующую строку в мой файл /etc/sysctl.conf:

vm.mmap_min_addr = 0

Но это тоже не работает.

Кто-нибудь знает, почему операция mem_map, как эта, не разрешена, и как я могу ее обойти?

Спасибо.

Ответы [ 2 ]

9 голосов
/ 21 ноября 2011

Звучит так, как будто ядро ​​скомпилировано с включенным CONFIG_STRICT_DEVMEM. Это функция безопасности, предотвращающая доступ пользовательского пространства к (возможно, чувствительной) физической памяти объемом более 1 МБ (IIRC). Вы можете отключить это с помощью sysctl dev.mem.restricted.

2 голосов
/ 06 марта 2018

У меня была похожая проблема, которая возникала, когда я пытался использовать flashrom на плате APU2c4 с Arch Linux.

Параметр sysctl dev.mem.restricted не был доступен в моей системе, и использование самоскомпилированного ядра былоу меня нет выбора.

Я обошел проблему, установив iomem Kernelparameter на relaxed через Grub:

# /boot/grub/grub.cfg
linux   /boot/vmlinuz-linux iomem=relaxed

Конечно, перезагрузка необходима для этого решения.

Ссылка:
https://www.reddit.com/r/libreboot/comments/6wvyry/flashrom_failures_to_access/
https://www.flashrom.org/FAQ
https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...