Когда процесс входит в ядро посредством исключения или прерывания, ядро должно сохранить текущее состояние машины до начала обслуживания события. Для PC состояние машины, которое должно быть сохранено, включает счетчик команд, указатель стека пользователя, регистры общего назначения и слово состояния процессора. Инструкция исключения PC сохраняет счетчик команд и слово состояния процессора как часть фрейма стека исключения; указатель стека пользователя и регистры должны быть сохранены программным обработчиком исключения. Если состояние машины не было бы сохранено полностью, ядро могло бы изменить значения в текущей исполняющейся программе неподходящим образом. Поскольку прерывания могут возникать между любыми двумя инструкциями уровня пользователя (а на некоторых архитектурах и между частями одной инструкции) и поскольку они могут вообще не относиться к текущему выполняющемуся процессу, не полностью сохраненное состояние могло бы вызывать в правильных программах загадочные и трудновоспроизводимые ошибки.
Точная последовательность действий, необходимая для сохранения состояния процесса, полностью зависит от машины, хотя PC представляет хороший пример обычной процедуры. Исключение или системный вызов запустят следующие события. Происходит аппаратное переключение в режим ядра (супервизора), так что проверки доступа к памяти осуществляются с привилегиями ядра, ссылки на стек используют стек ядра для процессов и могут выполняться привилегированные инструкции. Аппаратура помещает в стек ядра для процессов счетчик команд, слово состояния процессора и информацию, описывающую тип исключения. (На отличных от PC архитектурах эта информация может включать также номер системного вызова и регистры общего назначения.) Процедура на языке ассемблера сохраняет всю информацию о состоянии, не сохраненную аппаратным обеспечением. На PC эта информация включает регистры общего назначения и указатель стека пользователя, также сохраняемые в стеке ядра для процессов.
После этого предварительного сохранения состояния ядро вызывает процедуру С, которая может свободно использовать регистры общего назначения, как любая другая процедура на С, не беспокоясь об изменении состояния ничего не подозревающего процесса.
Есть три главные разновидности обработчиков, соответствующие определенным входам в ядро.
Каждый тип обработчика принимает свой собственный набор параметров. Для системного вызова это номер системного вызова и фрейм исключения. Для исключения это тип исключения, соответствующая информация о плавающей точке и виртуальном адресе, относящаяся к исключению, и фрейм исключения. (Аргументы фрейма исключения для исключения и системного вызова не одни и те же. Аппаратура PC сохраняет различную информацию в зависимости от различных типов исключений.) Для аппаратного прерывания единственным параметром является номер устройства (или платы).
Возвращение из ядра
Когда обработка системного входа завершена, состояние процесса пользователя восстанавливается и управление возвращается процессу пользователя. Возвращение в процесс пользователя противоположно процессу входа в ядро. Процедура, написанная на ассемблере, восстанавливает регистры общего назначения и указатель стека пользователя, помещенные ранее в стек. Аппаратура восстанавливает счетчик команд и слово состояния процессора и переключается в режим пользователя таким образом, что будущие ссылки на стек используют указатель стека пользователя, привилегированные инструкции не могут выполняться, а проверки доступа к памяти осуществляются с использованием привилегий уровня пользователя. Затем выполнение продолжается со следующей инструкции в процессе пользователя.
Вычисления приоритета, использованные в алгоритме кратковременного планирования, разбросаны в различных частях системы. Периодически запускаются две процедуры, schedcpuQ и roundrobinQ. SchedcpuQ пересчитывает приоритеты потоков раз в секунду, используя формулу 4.2, и обновляет значение kg_slptime для потоков, заблокированных вызовом sleepQ. Процедура roundrobinQ запускается 10 раз в секунду и заставляет систему перепланировать потоки в (непустой) очереди с самым высоким приоритетом в режиме карусели, что дает каждому потоку квант времени в 100 миллисекунд.
Некоторые из коммуникационных доменов, поддерживаемые механизмом I2С сокетов, предоставляют доступ к сетевым протоколам. Эти протоколы реализованы в виде отдельного программного уровня, находящегося в ядре логически ниже программного обеспечения сокетов. Ядро предоставляет много дополнительных служб, таких, как управление буферами, маршрутизация сообщений, стандартизированные интерфейсы к протоколам и интерфейсы к драйверам сетевых интерфейсов для использования различных сетевых протоколов.
Исторически пользователи взаимодействовали с системой, используя подключенные к компьютеру через жестко запаянные линии связи терминалы. Хотя фиксированные терминалы в значительной степени остались в истории, обработка символов, осуществляемая для ввода/вывода с клавиатуры, по-прежнему важна. Наиболее обычный вид сеанса пользователя в FreeBSD использует псевдотерминал. Псевдотерминал состоит из пары устройств, называемых ведущим (master) и ведомым (slave) устройствами.
Первоначально сеть использовалась для передачи данных из одной машины в другую. Позже она развилась, давая возможность пользователям удаленно регистрироваться на другой машине. Следующим логическим шагом было перемещение данных к пользователю, вместо необходимости пользователю идти к данным - так родились сетевые файловые системы. Пользователи, работающие локально, не подвергаются сетевым задержкам при каждом нажатии на клавишу, таким образом они имеют более отзывчивое окружение.
Видимая пользователю часть файловой системы представляет собой ее иерархическое именование, блокировки, квоты, управление атрибутами и защиту. Но большая часть реализации файловой системы содержит организацию и управление данными на физическом носителе. За размещение содержимого файлов на физическом носителе отвечает файловое хранилище (filestore). FreeBSD использует традиционный формат быстрой файловой системы Беркли (Berkley fast filesystem). На диске организуются группы протяженных блоков, называемых группами цилиндров.