, позволяющий доступу к / dev / mem
неподваривающимися процессами, действительно будет проблемой безопасности и не должна быть разрешена.
На моей системе ls -l / dev / mem
выглядит так:
crw-r----- 1 root kmem 1, 1 Sep 8 10:12 /dev/mem
Итак CORT
может прочитать и написать его, члены KMEM
Группа (из которых не может быть ничего), может прочитать ее, но не писать, и все остальные не могут открыть его вообще. Так что это должно быть безопасно.
Если ваш / dev / mem
- это что-то вроде шахты, ваш безвивальный процесс даже не смогли открыть файл вообще, не говоря уже MMAP
.
Проверьте разрешения / dev / mem
в вашей системе, чтобы убедиться, что они защищены!
Адреса, видимые для пользовательского процесса (независимо от того, работает ли он как root или непривилегированный пользователь), являются виртуальными адресами, которые MMU преобразует в физические адреса через таблицы страниц. Настройка таблиц страниц - это привилегированная операция, которая может выполняться только кодом ядра; однако после того, как таблицы страниц установлены, доступ к памяти разрешен в пользовательском режиме.
Конкретно, ваш код использует mmap
, чтобы запросить у ядра настройку таблиц страниц, чтобы разрешить доступ к заданному диапазону физической памяти. Ядро проверяет привилегии процесса (у него есть доступ для чтения / записи к / dev / mem
) и настраивает таблицы страниц, чтобы разрешить ему доступ к физической памяти.
Значение leds
- это виртуальный адрес. Пока оно находится в пространстве пользователя текущего процесса, процесс может обращаться к нему напрямую через инструкции типа leds[0] = val
без необходимости находиться в привилегированном режиме, независимо от того, куда в оперативной памяти сопоставлен этот виртуальный адрес