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