Sunday, Feb 05th

Last update12:13:00 PM GMT

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

Загружаемые модули ядра FreeBSD

Некоторые модули ядра Freebsd можно загружать, выключать и выгружать во время работы системы. Наличие системы, в которой службы ядра могут загружаться и выгружаться во время работы, имеет ряд преимуществ перед системой, в которой все службы ядра должны компоноваться во время построения.

Для системных программистов возможность загружать и выгружать модули в ходе работы означает, что они могут быстрее разрабатывать свой код. Непосредственно компоновать с ядром нужно лишь те модули, которые абсолютно необходимы для системы, такие, как управление памятью или планировщик. Модуль ядра ОС можно откомпилировать, загрузить, отладить, выгрузить, изменить, откомпилировать и снова загрузить без необходимости компоновать его непосредственно с ядром или необходимости перезагружать систему.

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

Одной из проблем при разрешении загрузки и выгрузки модулей во время работы является безопасность. В версиях BSD до FreeBSD ядро было цельным и полностью защищенным от изменения пользователем во время работы. Единственным способом взаимодействия с работающим ядром был интерфейс syscall (системных вызовов). Системные вызовы определялись во время построения ядра и предоставляли лишь узкий канал коммуникации. Этот плотно контролируемый интерфейс предоставлял уровень безопасности.

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

По этим соображениям безопасности большинство людей, работающих с FreeBSD в коммерческом окружении, продолжают использовать полностью целостные ядра и не загружают случайные службы во время работы. Загружаемые модули ядра FreeBSD объявляются следующим образом:

DECLARE_MODULE (имя,   данные,   подсистема,   порядок)

У каждого модуля есть имя, подсистема и порядок, служащие тем же целям, что и в макросе SYSINIT. Ключевым отличием является использование аргумента данные, представляющего собой структуру данных, определенную следующим образом:

int  (*modeventhand_t)(
struct module *module,
int command, void
*argument);
typedef moduledata =  { const
char *name; modeventhand_t
event_handler; void *data; }
moduledata_t;

У всех модулей есть связанная с ними версия, которая объявляется с помощью макроса MODULE_VERSION. Без версии было бы невозможно отличить различные переработанные версии того же самого модуля, что затрудняет обновления на месте. Одним из последних макросов, используемых модулями ядра, является SYSCALLMODULEHELPER, который разработчики используют для добавления к ядру новых системных вызовов.

Для того чтобы были модули ядра, которые можно загружать как при запуске системы, так и в ходе ее работы, необходимо учесть два различных случая. Когда модуль загружается в ходе запуска системы, он уже обработан процессом построения ядра, что означает, что его точки входа системных вызовов и другие данные уже известны ядру. Это знание облегчает процесс загрузки. Все, что нужно сделать, - это вызвать обработчик событий модуля с помощью команды MOD_LOAD. Во время работы модуль должен быть загружен в память, зарегистрирован ядром, и его системные вызовы должны быть динамически добавлены в таблицу системных вызовов. После того как вся эта работа проделана, его можно инициализировать, добавив свой обработчик событий. Вся загрузка во время выполнения обрабатывается системным вызовом kldload и процедурой module register.

Чтобы сохранить интерфейс, используемый программистами простым, все эти функциональные возможности скрыты за макросом DECLAREMODULE и использованием единственной процедуры обработки событий. При создании модуля ядра программисту нужно беспокоиться лишь о создании обработчика событий модуля и экспортировании системных вызовов обработчика модуля через макросы.

Основные понятия: модули ядра, модули ядра linux, загрузить модуль ядра, модули ядра freebsd, модули ядра ос


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

вызов курьера и ремонт vertu любых марок
Сейчас 20 гостей онлайн

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