Когда процесс входит в ядро посредством исключения или прерывания, ядро должно сохранить текущее состояние машины до начала обслуживания события. Для PC состояние машины, которое должно быть сохранено, включает счетчик команд, указатель стека пользователя, регистры общего назначения и слово состояния процессора. Инструкция исключения PC сохраняет счетчик команд и слово состояния процессора как часть фрейма стека исключения; указатель стека пользователя и регистры должны быть сохранены программным обработчиком исключения. Если состояние машины не было бы сохранено полностью, ядро могло бы изменить значения в текущей исполняющейся программе неподходящим образом. Поскольку прерывания могут возникать между любыми двумя инструкциями уровня пользователя (а на некоторых архитектурах и между частями одной инструкции) и поскольку они могут вообще не относиться к текущему выполняющемуся процессу, не полностью сохраненное состояние могло бы вызывать в правильных программах загадочные и трудновоспроизводимые ошибки.
Точная последовательность действий, необходимая для сохранения состояния процесса, полностью зависит от машины, хотя PC представляет хороший пример обычной процедуры. Исключение или системный вызов запустят следующие события.
· Происходит аппаратное переключение в режим ядра (супервизора), так что проверки доступа к памяти осуществляются с привилегиями ядра, ссылки на стек используют стек ядра для процессов и могут выполняться привилегированные инструкции.
· Аппаратура помещает в стек ядра для процессов счетчик команд, слово состояния процессора и информацию, описывающую тип исключения. (На отличных от PC архитектурах эта информация может включать также номер системного вызова и регистры общего назначения.)
Процедура на языке ассемблера сохраняет всю информацию о состоянии, не сохраненную аппаратным обеспечением. На PC эта информация включает регистры общего назначения и указатель стека пользователя, также сохраняемые в стеке ядра для процессов.
После этого предварительного сохранения состояния ядро вызывает процедуру С, которая может свободно использовать регистры общего назначения, как любая другая процедура на С, не беспокоясь об изменении состояния ничего не подозревающего процесса.
Есть три главные разновидности обработчиков, соответствующие определенным входам в ядро.
1. Syscall() для системного вызова.
2. Тгар() для аппаратных и программных исключений, кроме системных вызовов.
3. Соответствующий обработчик прерывания драйвера устройства для аппаратного прерывания.
Каждый тип обработчика принимает свой собственный набор параметров. Для системного вызова это номер системного вызова и фрейм исключения. Для исключения это тип исключения, соответствующая информация о плавающей точке и виртуальном адресе, относящаяся к исключению, и фрейм исключения.
- 19/05/2010 21:00 - Возвращение из ядра
- 18/05/2010 21:00 - Выполнение системного вызова
- 18/05/2010 12:57 - Организация времени выполнения
- 17/05/2010 20:11 - Работа системы
- 16/05/2010 18:53 - Межпроцессное взаимодействие
- 15/05/2010 13:20 - Укорачивание файлов