В предыдущих версиях BSD инициализация ядра нижележащего оборудования выполнялась исключительно индивидуально написанным кодом. Для каждого, кто хотел добавить новую службу или подсистему, было необходимо глубокое понимание всей операционной системы, что замедляло развитие ядра. В FreeBSD был разработан метод для разделения служб ядра на модули.
Логическое упорядочивание инициализации модулей во время загрузки, упрощая экспериментальное добавление новых возможностей к операционной системе. Все подсистемы перечислены в заголовочном файле /sys/sys/kernel.h.
В FreeBSD используются два вида модулей ядра. Модули, которые могут загружаться в ядро и выгружаться из него в ходе выполнения, называются загружаемыми модулями ядра. Модули ядра, которые должны быть загружены во время начальной загрузки и не могут выгружаться в ходе выполнения, считаются постоянными модулями ядра. Постоянный модуль экспортируется системе с использованием макроса SYSINIT для идентификации его процедуры инициализации модуля ядра и порядка, в котором она должна вызываться. SYSINIT(имя, подсистема, порядок, функция, идентификатор)
Все модули организованы в двухуровневую иерархию для предоставления упорядоченного запуска системы. Аргумент подсистема является первым уровнем иерархии. Каждой подсистеме назначается определенная числовая константа, которая создает упорядочивание первого уровня модулей, которые должны быть загружены. Второй уровень иерархии управляется аргументом порядок. Если два модуля находятся в одной и той же подсистеме, порядок показывает, который должен идти сначала. Аргумент функция является функцией инициализации модуля, которую ядро вызывает при запуске системы.
После завершения кодом на языке ассемблера своей работы он вызывает первую написанную на С процедуру ядра: процедуру mistartup(). Процедура mi_startup() сначала сортирует список модулей, которые должны быть запущены, а затем вызывает процедуру функция каждой. Некоторая часть инициализации является машинно-зависимой. Другая часть инициализации ядра является машинно-независимой. Она включает службы, которым не нужно знать о нижележащем оборудовании. Каждый модуль ядра реализован либо как аппаратно-зависимый, либо аппаратно-независимый, в соответствии с его нуждами.
После завершения последовательности запуска на языке ассемблера через точки входа С вызывается любой другой код на языке ассемблера, необходимый для запуска системы. Это разделение зависимой и независимой инициализации модуля ядра упрощает задачу программирования последовательности запуска на новой платформе по сравнению с предыдущими выпусками BSD.
- 09/01/2010 12:12 - Запуск межпроцессного взаимодействия
- 09/01/2010 10:46 - Загружаемые модули ядра FreeBSD
- 09/01/2010 10:36 - Инициализация модулей устройств. Подсистема mbuf.
- 08/01/2010 22:03 - Инициализация потоков и процессов ядра
- 08/01/2010 21:52 - Базовые службы и память ядра
- 08/01/2010 21:32 - Инициализация ядра
- 08/01/2010 21:23 - Начальная загрузка. Программа Boot
- 08/01/2010 21:06 - Обзор. Команда boot. FreeBSD boot