Если я напишу программу, которая пытается прочитать память по каждому возможному адресу, и запустю ее на «полном» Unix, она не сможет получить доступ ко всей физической ОЗУ. Но как операционная система препятствует этому?
Я больше знаком с небольшими архитектурами ЦП, где любой фрагмент кода сборки может получить доступ ко всему. Я не понимаю, как программа (ядро) может обнаружить такие вредоносные операции.
Ответы:
Это не ядро, которое предотвращает плохой доступ к памяти, это процессор. Роль ядра - только правильно настроить процессор.
Точнее, аппаратный компонент, который предотвращает неправильный доступ к памяти, - это MMU . Когда программа обращается к адресу памяти, адрес декодируется ЦПУ на основе содержимого MMU. MMU устанавливает преобразование из виртуальных адресов в физические адреса: когда процессор выполняет загрузку или сохранение по определенному виртуальному адресу, он вычисляет соответствующий физический адрес на основе содержимого MMU. Ядро устанавливает конфигурацию MMU таким образом, что каждая программа может получить доступ только к той памяти, на которую она имеет право. Регистры памяти и оборудования других программ вообще не отображаются в памяти программы: эти физические адреса не имеют соответствующих виртуальных адресов в конфигурации MMU для этой программы.
При переключении контекста между различными процессами ядро изменяет конфигурацию MMU так, чтобы оно содержало желаемый перевод для нового процесса.
Некоторые виртуальные адреса не отображаются вообще, т. Е. MMU переводит их в специальное значение «нет такого адреса». Когда процессор разыменовывает не сопоставленный адрес, это вызывает ловушку: процессор разветвляется в предопределенное место в коде ядра. Некоторые ловушки являются законными; например, виртуальный адрес может соответствовать странице , находящейся в пространстве подкачки , и в этом случае код ядра будет загружать содержимое страницы из подкачки, а затем переключаться обратно на исходную программу таким образом, чтобы инструкция доступа к памяти выполнялась снова. Другие прерывания недопустимы, и в этом случае процесс получает сигнал, который по умолчанию немедленно убивает программу (и, если нет, переходит к обработчику сигналов в программе: в любом случае инструкция доступа к памяти не завершена).
источник