Linux Kernel (Ядро линукса) (часть 2)


Динамическая проверка адресов: код обработки исключения

Как мы видели ранее, макрос access ok выполняет грубую проверку допустимости линейных адресов, переданных в качестве параметров системного вызова. Эта проверка лишь гарантирует, что процесс режима пользователя не пытается манипулировать адресным пространством ядра. Тем не менее линейные адреса, переданные в качестве параметров, могут и не принадлежать адресному пространству процесса. В этом случае, если ядро попытается обратиться по одному из таких недопустимых адресов, возникнет исключение "ошибка обращения к странице.

Прежде чем описать, как ядро распознает такой тип ошибки, мы выделим ситуации, в которых исключение ошибка обращения к странице” может возникнуть в режиме ядра. Обработчик этого исключения должен отличать одну ситуацию от другой, потому что они требуют разных действий:
- Ядро пытается обратиться к странице, принадлежащей адресному пространству процесса, но либо соответствующий страничный кадр отсутствует, либо ядро пытается записать данные на страницу, доступную только для чтения. В таких случаях обработчик должен выделить и инициализировать новый страничный кадр
- Ядро обращается к странице в своем адресном пространстве, но соответствующая запись в Таблице Страниц еще не проинициализирована В этом случае ядро должно правильно заполнить некоторые записи в Таблицах Страниц текущего процесса.
- Некоторые функции ядра содержат программные ошибки, в результате чего при выполнении программы возникает исключение. Возможно также,
что исключение возникает вследствие непостоянного аппаратного сбоя. Когда это происходит, обработчик должен выполнить дамп, называемый "kernel oops”
- Случай, представленный в этой главе: служебная процедура системного вызова пытается читать или записывать в область памяти, адрес которой передан в качестве параметра системного вызова, но этот адрес не принадлежит адресному пространству процесса.
Обработчик исключения "ошибка обращения к странице” легко распознает первый случай, определив, что адрес, вызвавший ошибку, принадлежит одной из областей памяти процесса.

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

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...