Системные вызовы

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

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

В конечном счете системный вызов возвращается в вызывающий процесс либо успеш­но, либо неудачно. На архитектуре PC успех или неудача возвращаются в виде бита переноса в слове состояния программы пользовательского процесса: если он равен нулю, возвращение было успешным; в противном случае возвращение безуспешно. На многих машинах возвращаемые значения функций С передаются через регистр общего назначения (для PC регистр данных ЕАХ). Процедуры в ядре, которые реали­зуют системные вызовы, возвращают значения, которые обычно связаны с глобальной переменной еггпо. После системного вызова обработчик системного вызова ядра оставляет это значение в регистре. Если системный вызов завершился неудачей, биб­лиотечная процедура С помещает это значение в еггпо и устанавливает в возвращае­мом регистре значение -1. Ожидается, что вызывающий процесс заметит значение в возвращаемом регистре и проверит еггпо. Механизм, включающий бит переноса и глобальную переменную еггпо, существует по историческим причинам, ведя начало от PDP-11.

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

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

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

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

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

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

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

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

  • Терминалы -

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

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

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

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

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