Sunday, Feb 05th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Запуск и выключение Вход в ядро

Вход в ядро

Когда процесс входит в ядро посредством исключения или прерывания, ядро должно сохранить текущее состояние машины до начала обслуживания события. Для PC состояние машины, которое должно быть сохранено, включает счетчик команд, указатель стека пользователя, регистры общего назначения и слово состояния процессора. Инструкция исключения PC сохраняет счетчик команд и слово состояния процессора как часть фрейма стека исключения; указатель стека пользователя и регистры должны быть сохранены программным обработчиком исключения. Если состояние машины не было бы сохранено полностью, ядро могло бы изменить значения в текущей исполняющейся программе неподходящим образом. Поскольку прерывания могут возникать между любыми двумя инструкциями уровня пользователя (а на некоторых архитектурах и между частями одной инструкции) и поскольку они могут вообще не относиться к текущему выполняющемуся процессу, не полностью сохраненное состояние могло бы вызывать в правильных программах загадочные и трудновоспроизводимые ошибки.

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

· Происходит аппаратное переключение в режим ядра (супервизора), так что проверки доступа к памяти осуществляются с привилегиями ядра, ссылки на стек используют стек ядра для процессов и могут выполняться привилегированные инструкции.

· Аппаратура помещает в стек ядра для процессов счетчик команд, слово состояния процессора и информацию, описывающую тип исключения. (На отличных от PC архитектурах эта информация может включать также номер системного вызова и регистры общего назначения.)

Процедура на языке ассемблера сохраняет всю информацию о состоянии, не сохраненную аппаратным обеспечением. На PC эта информация включает регистры общего назначения и указатель стека пользователя, также сохраняемые в стеке ядра для процессов.

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

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

1. Syscall() для системного вызова.

2. Тгар() для аппаратных и программных исключений, кроме системных вызовов.

3. Соответствующий обработчик прерывания драйвера устройства для аппаратного прерывания.

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


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 24 гостей онлайн

Реклама на сайте:

установка кондиционеров в серпухове

qip 2005 не отвечает современным требованиям агентом вылетал каждые 2-3 минуты и вешал квип.