Как ядро ​​предотвращает чтение вредоносной программой всей физической памяти?

10

Если я напишу программу, которая пытается прочитать память по каждому возможному адресу, и запустю ее на «полном» Unix, она не сможет получить доступ ко всей физической ОЗУ. Но как операционная система препятствует этому?

Я больше знаком с небольшими архитектурами ЦП, где любой фрагмент кода сборки может получить доступ ко всему. Я не понимаю, как программа (ядро) может обнаружить такие вредоносные операции.

nowox
источник
2
Обычно MMU заботится о том, чтобы вы не могли получить доступ к памяти за пределами разрешенных областей.
ot--
1
Ну, MMU настроен сборкой. Таким образом, код сборки может изменить конфигурацию MMU и получить доступ к другой странице памяти, верно?
nowox
Это верно только в том случае, если вы запускаете свой код от имени пользователя root.
ot--
2
Вы должны прочитать о таблицах страниц и абстракции ядра там.
Кларус
@ott: даже root не может изменить MMU (по крайней мере, в Linux). Только ядро ​​делает.
Василий Старынкевич

Ответы:

12

Это не ядро, которое предотвращает плохой доступ к памяти, это процессор. Роль ядра - только правильно настроить процессор.

Точнее, аппаратный компонент, который предотвращает неправильный доступ к памяти, - это MMU . Когда программа обращается к адресу памяти, адрес декодируется ЦПУ на основе содержимого MMU. MMU устанавливает преобразование из виртуальных адресов в физические адреса: когда процессор выполняет загрузку или сохранение по определенному виртуальному адресу, он вычисляет соответствующий физический адрес на основе содержимого MMU. Ядро устанавливает конфигурацию MMU таким образом, что каждая программа может получить доступ только к той памяти, на которую она имеет право. Регистры памяти и оборудования других программ вообще не отображаются в памяти программы: эти физические адреса не имеют соответствующих виртуальных адресов в конфигурации MMU для этой программы.

При переключении контекста между различными процессами ядро ​​изменяет конфигурацию MMU так, чтобы оно содержало желаемый перевод для нового процесса.

Некоторые виртуальные адреса не отображаются вообще, т. Е. MMU переводит их в специальное значение «нет такого адреса». Когда процессор разыменовывает не сопоставленный адрес, это вызывает ловушку: процессор разветвляется в предопределенное место в коде ядра. Некоторые ловушки являются законными; например, виртуальный адрес может соответствовать странице , находящейся в пространстве подкачки , и в этом случае код ядра будет загружать содержимое страницы из подкачки, а затем переключаться обратно на исходную программу таким образом, чтобы инструкция доступа к памяти выполнялась снова. Другие прерывания недопустимы, и в этом случае процесс получает сигнал, который по умолчанию немедленно убивает программу (и, если нет, переходит к обработчику сигналов в программе: в любом случае инструкция доступа к памяти не завершена).

Жиль "ТАК - перестань быть злым"
источник
Не могли бы вы немного указать оператор «адрес декодируется процессором на основе содержимого MMU» ? Есть ли актуальный код в работающей программе, которая декодирует адреса? Или когда ЦП делает доступ к адресу - доступ осуществляется к MMU, который правильно переводит / обрабатывает его (делает доступ к памяти или кешу и возвращает результат, или запускает процедуру ядра)? Итак, с точки зрения микроконтроллера / сборки, MMU является новой частью. Процессор не подключен напрямую к памяти, он подключен к MMU, и именно здесь выполняется абстракция виртуальной памяти.
xealits
3
@xealits Перевод виртуального адреса в физический адрес выполняется внутри MMU, который представляет собой аппаратную схему. Нет кода для этого в программе или в ядре. Ядро вызывается только в исключительных случаях, когда программа пытается получить доступ к виртуальному адресу, для которого запись MMU говорит «неверный адрес». Ядро также выполняет настройку регистров и таблиц в ОЗУ, которые использует MMU.
Жиль "ТАК - перестань быть злым"