Ловушка операционной системы: что вызывает ошибки адресации? - PullRequest
0 голосов
/ 11 мая 2018

После выделения пространства логической памяти для конкретного процесса защита этого пространства обеспечивается использованием базового регистра и предельного регистра . Для защиты от доступа к памяти за пределами выделенного пространства памяти для процесса аппаратное обеспечение ЦП сравнивает каждый запрошенный адрес памяти с этими регистрами. Если выполняется одно из двух следующих условий, возникает ловушка операционной системы:

  1. Целевой адрес меньше базового регистра .
  2. Целевой адрес больше или равен регистру ограничения .

Эту логику можно наблюдать визуально на Рисунок 7.2 ниже.

Figure 7.2

Выше объясняется, как они происходят, например,

любая попытка программы, выполняющейся в пользовательском режиме, получить доступ к памяти операционной системы или памяти другого пользователя приводит к ловушке для операционной системы.

Но каковы некоторые примеры того, когда запрошенный адрес будет фактически находиться за пределами выделенного пространства памяти программы? Что может вызвать это?

[Источник изображения и цитаты: Основы операционной системы, 2-е изд. - Авраам Зильбершатц]

1 Ответ

0 голосов
/ 11 мая 2018

На практике современное оборудование (например, ПК x86-64, планшеты ARM, ...) больше не использует базовый и лимитный регистры (а i286 сделал), но имеет MMU .

Подробнее о MMU , подкачки , ошибка сегментации , виртуальная память , виртуальное адресное пространство и Операционная система: три простых компонента (свободно загружается)

Но каковы некоторые примеры того, когда запрошенный адрес будет фактически находиться за пределами назначенного пространства памяти программы?

Любой вид ошибки сегментации в пользовательском пространстве , в частности разыменование указателя NULL (или некоторой «неинициализированной» переменной указателя, которая содержит случайную комбинацию битов вне адреса пространство). Такие ошибки распространены в программах на C (в пространстве пользователя). Для упрощенного примера:

int *ptr = NULL;
/// some long code or execution which does not change the `ptr` value
*ptr = 34; // SEGMENTATION FAULT 

Коду ядра следует доверять, и он не получает ошибки сегментации (по гипотезе). Неправильное поведение кода ядра и разыменование неверного адреса может привести к сбою компьютера.

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

Кстати, в вашем вопросе нет упоминания DMA (но ваши комментарии есть). На практике DMA управляется только ядром (например, для ввода-вывода физического диска), который перед настройкой и запуском гарантирует, что все адреса блоков действительны (и разбиты на страницы). в). Поэтому на практике неправильных адресов в DMA никогда не бывает (в зависимости от аппаратного обеспечения DMA может использовать физические или виртуальные адреса). В более общем смысле ожидается, что ядро ​​ 1048 * позволит избежать ошибок, таких как ошибка сегментации или другие виды неправильных адресов: пространство пользователя может иметь неправильные адреса (ядро создает ошибки сегментации, когда это происходит, и при Unix дает некоторый SIGSEGV сигнал приложению), но пространство ядра должно быть доверенным кодом, использующим только хорошие адреса.

...