Права доступа к / dev / mem - PullRequest
19 голосов
/ 26 мая 2011

У меня есть набор вопросов относительно /dev/mem:

  1. Многие статьи в сети, похоже, ссылаются на /dev/mem как шлюз к "Physical RAM". Но если я прав, /dev/mem - это шлюз к "Physical Address Space" процессора, который может включать в себя управляющие регистры многих HW-периферийных устройств, а не только ОЗУ? Пожалуйста, поправьте меня, если я ошибаюсь!

  2. Для предотвращения злоумышленников от неправильного использования /dev/mem и изменения памяти ядра должен быть включен флаг CONFIG_STRICT_DEVMEM, который запретит пользовательским приложениям доступ к физическому адресному пространству за пределами 1 МБ. Я проверил файл конфигурации на моем ПК (Ubuntu) и обнаружил, что CONFIG_STRICT_DEVMEM = y. И я написал программу, которая пытается читать в физическую память за пределами 1 МБ, и я смог читать! Нет ошибки сегментации или ошибки Operation NOT Permitted. Как это возможно?

Моя программа выглядит примерно так:

fd = open ( "/dev/mem", O_RDWR);
ptr = (int*) mmap(0, MAP_SIZE, PROT_READ, fd, myAddress & (~MAP_MASK));
printf("%d", *ptr);

Ответы [ 2 ]

14 голосов
/ 27 мая 2011
  1. Да, вы правы, / dev / mem позволяет вам сопоставить любой физический адрес, включая IO, не связанный с RAM. Это может быть полезно для быстрого и грязного взлома доступа к некоторому аппаратному устройству без написания драйвера ядра.

  2. CONFIG_STRICT_DEVMEM заставляет ядро ​​проверять адреса в / dev / mem с devmem_is_allowed() в arch/x86/mm/init.c, а комментарий там объясняет:

    * On x86, access has to be given to the first megabyte of ram because that area
    * contains bios code and data regions used by X and dosemu and similar apps.
    * Access has to be given to non-kernel-ram areas as well, these contain the PCI
    * mmio resources as well as potential bios/acpi data regions.
    

    ваш адрес 0xFFFF0000 вполне может быть не RAM, поскольку BIOS обычно помещают память ввода-вывода чуть ниже 4 ГБ, поэтому вы можете отобразить ее даже при STRICT_DEVMEM.

3 голосов
/ 26 мая 2011

Что означает следующее:

cat /dev/mem | wc

Я получаю:

cat: /dev/mem: Operation not permitted
   1908   11791 1048576

Так что для меня это останавливается на 1 МБ.

Обратите внимание, что cat использует open, а не mmap, так что это не идентичный тест.

Вы уверены, что читаете больше 1 МБ?

...