Вход в ядро

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

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

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

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

  • SyscallQ для системного вызова.
  • TrapQ для аппаратных и программных исключений, кроме системных вызовов.
  • Соответствующий обработчик прерывания драйвера устройства для аппаратного прерывания.

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

Возвращение из ядра

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

Еще материалы

  • Процедуры вычисления приоритета потока -

    Вычисления приоритета, использованные в алгоритме кратковременного планирования, разбросаны в различных частях системы. Периодически запускаются две процедуры, schedcpuQ и roundrobinQ. SchedcpuQ пересчитывает приоритеты потоков раз в секунду, используя формулу 4.2, и обновляет значение kg_slptime для потоков, заблокированных вызовом sleepQ. Процедура roundrobinQ запускается 10 раз в секунду и заставляет систе­му перепланировать потоки в (непустой) очереди с самым высоким приоритетом в режиме карусели, что дает каждому потоку квант времени в 100 миллисекунд.

  • Сетевая коммуникация -

    Некоторые из коммуникационных доменов, поддерживаемые механизмом I2С сокетов, предоставляют доступ к сетевым протоколам. Эти протоколы реализованы в виде отдельного программного уровня, находящегося в ядре логически ниже программного обеспечения сокетов. Ядро предоставляет много дополнительных служб, таких, как управление буферами, маршрутизация сообщений, стандартизированные интерфейсы к протоколам и интерфейсы к драйверам сетевых интерфейсов для использования раз­личных сетевых протоколов.

  • Терминалы -

    Исторически пользователи взаимодействовали с системой, используя подключенные к компьютеру через жестко запаянные линии связи терминалы. Хотя фиксированные терминалы в значительной степени остались в истории, обработка символов, осуществляе­мая для ввода/вывода с клавиатуры, по-прежнему важна. Наиболее обычный вид сеанса пользователя в FreeBSD использует псевдотерминал. Псевдотерминал состоит из пары устройств, называемых ведущим (master) и ведомым (slave) устройствами.

  • Сетевая файловая система - NFS -

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

  • Файловое хранилище -

    Видимая пользователю часть файловой системы представляет собой ее иерархическое именование, блокировки, квоты, управление атрибутами и защиту. Но большая часть реализации файловой системы содержит организацию и управление данными на физическом носителе. За размещение содержимого файлов на физическом носителе отвечает файловое хранилище (filestore). FreeBSD использует традиционный формат быстрой файловой системы Беркли (Berkley fast filesystem). На диске организуются группы протяженных блоков, называемых группами цилиндров.