Модули, вовлеченные в запуск механизмов межпроцессного взаимодействия, показаны в нижеследующей таблице. Первыми тремя модулями, которые должны быть загружены и запущены как часть поддержки IPC, являются семафоры, разделяемая память и очереди сообщений System V. Их делает интересными то, что это первые модули, которые могут загружаться и выгружаться во время работы.
В качестве примера мы используем модуль SI_SUB_SYSV_SEM. Он реализует семафоры System V для запуска средств межпроцессного взаимодействия. Этот модуль объявлен системе следующим образом:
static moduledata_t sysvsem_mod = {
"sysvsem",
&sysvsem_modload,
NULL
};
SYSCALL_MODULE_HELPER(semsys);
SYSCALL_MODULE_HELPER(semctl);
SYSCALL_MODULE_HELPER(semget);
SYSCALL_MODULE_HELPER(semop)
DECLARE_MODULE(sysvsem, sysvsem_mod, SI_SUB_SYSV_SEM, SI_ORDER_FIRST)
MODULE_VERSION(sysvsem, 1);
Все системные вызовы, предоставляемые модулем, объявлены в макросе SYSCALLJvlODULEHELPER. Макрос DECLARЈ_MODULE гарантирует, что добавляется элемент в последовательность запуска и что его порядок первый. В этой подсистеме нет других модулей, поэтому аргумент порядок не важен. Процедурой, которую последовательность запуска вызывает первой, является не sysvsem modload(), a modulejregisterjnit(), которая затем вызывает процедуру sysvsem modload() модуля. Поскольку этот модуль был скомпонован в ядро во время построения, все его системные вызовы и другие данные уже скомпонованы с ядром. Когда процедура module_register_init() завершается, модуль загружен и готов к использованию.
За подсистемой локального межпроцессного взаимодействия запускается несколько псевдоустройств. Псевдоустройства являются различными службами внутри ядра, которые представляют себя остальной системе как устройства. Примеры псевдоустройств включают буфер кадров, поддержку виртуальных LAN, сетевые брандмауэры и криптографические подсистемы. Все псевдоустройства объявлены в виде загружаемых модулей ядра.
Последние три модуля - S IS UBPROTOIF, SI_SUB_PROTO_DOMAIN и SISUBPROTOIFATTACHDOMAIN - инициализируют код, который поддерживает обсуждавшиеся в части IV сетевые возможности.В модуле SISUBPROTOIF есть одна процедура, if_check(), которая проверяет каждый сетевой интерфейс в системе на предмет того, был ли он правильно инициализирован. SISUBPROTODOMAIN является набором модулей, которые инициализируют различные коммуникационные домены, поддерживаемые ядром. Когда базовые структуры данных для доменов инициализированы процедурой domaininit(), инициализируются сами коммуникационные домены. Каждый домен отвечает за объявление себя путем использования макроса DOMAINSET, который предоставляет процедуру инициализации для вызова ядром, подобно макросу SYSINIT.
В отличие от многих предыдущих служб, которые были объявлены в виде модулей, сетевые домены объявляются таким образом, что их нельзя удалить. Домены закрепляются в ядре после своей загрузки, поскольку уровень сокетов может использовать структуры данных домена для активной коммуникации и межпроцессного взаимодействия; результат выгрузки домена, когда он используется, непредсказуем. Возможность выгрузки коммуникационного домена во время работы потребует множества изменений в модулях уровня сокетов и доменов.
- 09/01/2010 18:07 - Автоматическая перезагрузка и выключение системы
- 09/01/2010 17:59 - Конфигурация ядра FreeBSD (Linux)
- 09/01/2010 17:49 - Программа /usr/bin/login
- 09/01/2010 17:42 - /usr/libexec/getty
- 09/01/2010 17:25 - init - Инициализация уровня пользователя
- 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:42 - Инициализация модуля ядра