Как получить доступ к mmaped /dev/mem без сбоя ядра Linux?

. У меня есть простая программа, которая пытается получить доступ к физической памяти в пользовательском пространстве, где ядро ​​хранит первую страницу структуры. На 64-битной машине этот адрес :

  • . виртуальный адрес ядра :ffffea0000000000
  • физический адрес :0000620000000000

Я пытаюсь получить доступ к этому физическому адресу через mmap в пространстве пользователя. Но следующий код приводит к сбою ядра.

int *addr;
if ((fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0 ) {
    printf("Error opening file. \n");
    close(fd);
    return (-1);
}
/* mmap.  address of first struct page for 64 bit architectures 
 * is 0x0000620000000000.
 */
addr = (int *)mmap(0, num*STRUCT_PAGE_SIZE, PROT_READ, MAP_PRIVATE,
            fd, 0x0000620000000000);
printf("addr: %p \n",addr);
printf("addr: %d \n",*addr); /* CRASH. */
16
задан Nemo 29 July 2017 в 09:42
поделиться