Можно оценить организацию ядра FreeBSD двояко.
Самая большая часть ядра реализует системные службы, к которым приложения получают доступ через системные вызовы. В FreeBSD это программное обеспечение организовано следующим образом.
Большая часть программного обеспечения в данных категориях является машинно-независимой и переносимой между различными аппаратными архитектурами.
Машинно-зависимые аспекты ядра изолированы от основного кода. В частности, машинно-независимый код не содержит условного кода для определенных архитектур. Когда необходимо зависимое от архитектуры действие, машинно-независимый код вызывает архитектурно-зависимую функцию, которая размещается в машинно-зависимом коде. Машинно-зависимое программное обеспечение включает следующее:
Лишь небольшая часть ядра отвечает за загрузку системы. Этот код используется во время начальной загрузки и отвечает за установку аппаратного и программного окружения. Некоторые операционные системы (особенно с ограниченной физической памятью) сбрасывают или перекрывают (overlay) программное обеспечение, осуществляющее эти функции, после их отработки. Ядро FreeBSD не восстанавливает память, используемую кодом инициализации, поскольку это пространство памяти занимает лишь 0,2 процента ресурсов ядра, используемых на обычной машине. Код инициализации не находится также в каком-то определенном месте ядра - он разбросан везде и появляется обычно в местах, логически связанных с тем, что инициализируется
Большинство действий, связанных с доставкой сигнала потоку, выполняется в контексте этого потока. Поток проверяет свое поле td_siglist на предмет наличия ожидающих сигналов по крайней мере один раз при входе в систему, вызывая cursigQ.
SLEEPING - Поток заблокирован в ожидании события. Если поток находится в состоянии непрерываемого сна, больше ничего не должно предприниматься. В противном случае ядро может предпринять действие - либо непосредственно, либо косвенно, - пробудив поток. Есть два действия, которые можно применить непосредственно. Для сигналов, вызывающих остановку процесса, все потоки в процессе помещаются в состояние STOPPED и родительский процесс уведомляется об изменении состояния посредством отправки ему сигнала SIGCHLD.
Реализация сигналов разделена на две части, первая из которых - отправка сигнала процессу, а вторая - распознавание сигнала и доставка его потоку назначения. Сигналы может отправлять любой процесс или код, который выполняется на уровне прерывания. Доставка сигнала обычно имеет место в контексте получающего потока. Но когда сигнал форсирует остановку процесса, действие может быть проведено для всех потоков, связанных с этим процессом в тот момент, когда сигнал был отправлен.
Сигналы первоначально были спроектированы для моделирования исключительных событий, таких, как попытка пользователя завершить вышедшую из-под контроля программу. Они не предназначались для использования в качестве общего механизма межпроцессного взаимодействия, поэтому не было сделано попытки сделать их надежными. В более ранних системах каждый раз при перехвате сигнала восстанавливалось его действие по умолчанию.
Описание сигналов указывается для каждого процесса. Если процесс не указал действие на сигнал, ему предоставляется действие по умолчанию которое может быть одним из следующих: