Когда все базовые службы ядра на месте и созданы все базовые процессы, можно инициализировать остальные устройства в системе, куда входят диски, сетевые интерфейсы и таймеры. В ниже следующей таблице показаны основные компоненты, используемые для инициализации модулей устройств.
Модули устройств
|
Модуль |
Первая процедура |
|
|
SI_SUB. |
MBUF |
mbuf_init() |
|
SI_SUB |
INTR |
intr_init() |
|
SI_SUB. |
SOFTINTR |
start_softintr(), start_netisr() |
|
S1_SUB. |
DEVFS |
devfs_init(), devs_set_ready() |
|
SI_SUB. |
INITJF |
if_init() |
|
SI_SUB_ |
DRIVERS |
Множество различных процедур |
|
SI_SUB. |
CONFIGURE |
configure_first() |
|
SI_SUB. |
VFS |
vfsinitO |
|
SI_SUB_ |
CLOCKS |
initclocks() |
|
SI_SUB |
CLIST |
clist_init() |
Прежде чем могут быть инициализированы какие-либо устройства - в частности, сетевые интерфейсы, - должна быть установлена подсистема mbuf, чтобы у сетевых интерфейсов был набор буферов, который они могут использовать при своей собственной инициализации. Инициализация подсистемы mbuf осуществляется модулем SISUBMBUF и процедурой mbufinit(). Подсистеме mbuf нужно управлять двумя видами памяти: небольшими mbuf и кластерами mbuf cluster. Каждый вид памяти выделяется из своей собственной области памяти, чтобы сохранить распределитель простым и чтобы остающаяся память не фрагментировалась выделениями различных размеров.
В этот момент последовательности запуска в системе не разрешены прерывания. Теперь ядро устанавливает все потоки прерываний, которые будут обрабатывать прерывания, когда система начнет работу. Прерывания устанавливаются двумя модулями: SISUBINTR, который устанавливает потоки прерываний, обрабатывающие прерывания от устройств, и SISUBSOFTINTR, который создает потоки программных прерываний. Потоки программных прерываний используются службами, которые обрабатывают асинхронные события, которые не генерируются аппаратно. Потоки программных прерываний предоставляют программные часы, которые поддерживают подсистему выносок (callout). Они также предусматривают сетевой поток, который забирает входящие пакеты из очередей сетевых интерфейсов и передает их через сетевой стек.
Как часть запуска реальных аппаратных устройств, ядро сначала инициализирует файловую систему устройств, а затем готовит сетевой стек для работы с устройствами посредством вызова процедуры if_init(). Процедура if_init() не инициализирует какие-либо сетевые интерфейсы; она лишь устанавливает структуры данных, которые будут их поддерживать. В конечном счете устройства сами инициализируются модулями SISUBDRIVERS и SISUBCONFIGURE. Все устройства в системе инициализируются посредством автоконфигурирования.
После конфигурирования устройств инициализируется виртуальная файловая система. Запуск VFS является многоэтапным процессом, который влечет за собой инициализацию самой VFS, подсистемы vnode и подсистемы кеша имен и имен путей, которая отображает имена путей на массив inode. Поддержка именованных каналов также инициализируется как часть VFS.
Следующими системами для запуска являются системы, относящиеся к часам реального времени, предоставляемым аппаратным обеспечением. Процедура initclocks(), являющаяся частью модуля SISUBCLOCKS, вызывает специфическую для архитектуры процедуру cpu_initclocks() для инициализации в системе аппаратных часов и их запуска. После начала работы аппаратных часов запускаются другие службы, такие, как протокол сетевого времени (Network Time Protocol - NTP), опрос устройств и счетчик времени. Последние структуры данных для инициализации находятся в подсистеме терминалов модуля SI SUBCLIST. Все, что нужно сделать, - это выделить начальный набор cblock и добавить их в clist.
mbuf, mbuf freebsd, mbuf cluster
- 09/01/2010 17:34 - Сценарии запуска системы - rc conf, rc conf freebsd
- 09/01/2010 17:25 - init - Инициализация уровня пользователя
- 09/01/2010 12:33 - Запуск потоков ядра - scheduler
- 09/01/2010 12:12 - Запуск межпроцессного взаимодействия
- 09/01/2010 10:46 - Загружаемые модули ядра FreeBSD
- 08/01/2010 22:03 - Инициализация потоков и процессов ядра
- 08/01/2010 21:52 - Базовые службы и память ядра
- 08/01/2010 21:42 - Инициализация модуля ядра
- 08/01/2010 21:32 - Инициализация ядра
- 08/01/2010 21:23 - Начальная загрузка. Программа Boot