У меня есть ряд вопросов относительно /dev/mem
:
Многие статьи в сети, кажется, ссылаются на /dev/mem
как на шлюз к "Физической оперативной памяти"
. Но если я прав, /dev/mem
является шлюзом в "Физическое адресное пространство"
процессора, которое может включать управляющие регистры многих периферийных устройств HW, а не только оперативную память? Пожалуйста, поправьте меня, если я ошибаюсь!
Для того, чтобы предотвратить неправильное использование /dev/mem
злоумышленниками и изменение памяти ядра, необходимо включить флаг CONFIG_STRICT_DEVMEM
, который не позволит пользовательским приложениям получить доступ к физическому адресному пространству за пределами 1МБ. Я проверил конфигурационный файл на моем ПК (Ubuntu) и обнаружил, что CONFIG_STRICT_DEVMEM = y
. И я написал программу, которая пытается читать в физическую память за пределами 1 Мб, и смог прочитать! Ошибки сегментации или операции NOT Permitted. Как такое возможно?
Моя программа примерно так выглядит:
fd = open ( "/dev/mem", O_RDWR);
ptr = (int*) mmap(0, MAP_SIZE, PROT_READ, fd, myAddress & (~MAP_MASK));
printf("%d", *ptr);