Sunday, Feb 05th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Запуск и выключение Инициализация модуля ядра

Инициализация модуля ядра

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

Логическое упорядочивание инициализации модулей во время загрузки, упрощая экспериментальное добавление новых возможностей к операционной системе. Все подсистемы перечислены в заголовочном файле /sys/sys/kernel.h.

В FreeBSD используются два вида модулей ядра. Модули, которые могут загружаться в ядро и выгружаться из него в ходе выполнения, называются загружаемыми модулями ядра. Модули ядра, которые должны быть загружены во время начальной загрузки и не могут выгружаться в ходе выполнения, считаются постоянными модулями ядра. Постоянный модуль экспортируется системе с использованием макроса SYSINIT для идентификации его процедуры инициализации модуля ядра и порядка, в котором она должна вызываться. SYSINIT(имя,  подсистема,  порядок,  функция, идентификатор)

Все модули организованы в двухуровневую иерархию для предоставления упорядоченного запуска системы. Аргумент подсистема является первым уровнем иерархии. Каждой подсистеме назначается определенная числовая константа, которая создает упорядочивание первого уровня модулей, которые должны быть загружены. Второй уровень иерархии управляется аргументом порядок. Если два модуля находятся в одной и той же подсистеме, порядок показывает, который должен идти сначала. Аргумент функция является функцией инициализации модуля, которую ядро вызывает при запуске системы.

После завершения кодом на языке ассемблера своей работы он вызывает первую написанную на С процедуру ядра: процедуру mistartup(). Процедура mi_startup() сначала сортирует список модулей, которые должны быть запущены, а затем вызывает процедуру функция каждой. Некоторая часть инициализации является машинно-зависимой. Другая часть инициализации  ядра является машинно-независимой. Она включает службы, которым не нужно знать о нижележащем оборудовании. Каждый модуль ядра реализован либо как аппаратно-зависимый, либо аппаратно-независимый, в соответствии с его нуждами.

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


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 24 гостей онлайн

Реклама на сайте:

Баккара, flash игры заработай!