Книга: Операционная система UNIX
Встраивание драйверов в ядро
Встраивание драйверов в ядро
Драйвер устройства является частью кода ядра операционной системы и обеспечивает взаимодействие других подсистем UNIX с физическими или псевдоустройствами. Существует два основных метода встраивания кода и данных драйвера в ядро операционной системы: перекомпиляция ядра, позволяющая статически поместить драйвер, и динамическая загрузка драйвера в ядро в процессе работы системы.
Традиционно для встраивания драйвера в ядро UNIX требуется перекомпиляция ядра и перезапуск системы. Принципиально эта процедура не отличается от компиляции обычной программы, все компоненты ядра являются объектными модулями и редактор связей объединяет их с объектным модулем драйвера для получения исполняемого файла. В этом случае драйвер встраивается в ядро статически, т. е. независимо от фактического наличия устройства и ряда других причин, код и данные драйвера будут присутствовать в ядре UNIX до следующей перекомпиляции.
Однако тенденция развития современных версий операционной системы UNIX заключается в предоставлении возможности динамического расширения функциональности ядра. Это, в частности, относится к файловой системе, драйверам устройств и сетевым протоколам (точнее, драйверам подсистемы STREAMS). Возможность работы с новыми периферийными устройствами без необходимости перекомпиляции ядра обеспечивается загружаемыми драйверами. Вместо того чтобы встраивать модуль драйвера, основываясь на статических таблицах и интерфейсах, ядро содержит набор функций, позволяющих загрузить необходимые драйверы и, соответственно, выгрузить их, когда необходимость работы с данным устройством отпадает. При этом структуры данных для доступа к драйверам устройств также являются динамическими.
Динамическая установка драйвера в ядро операционной системы требует выполнения следующих операций:
? Размещение и динамическое связывание символов драйвера. Эта операция аналогична загрузке динамических библиотек, и выполняется специальным загрузчиком.
? Инициализация драйвера и устройства.
? Добавление точек входа драйвера в соответствующий коммутатор устройств.
? Установка обработчика прерываний драйвера.
Естественно, код динамически загружаемых драйверов сложнее, и содержит, помимо стандартных точек входа, ряд функций, отвечающих за загрузку и выгрузку драйвера, а также ряд дополнительных структур. Пример дополнительных функций и структур данных, которые должны быть определены в динамически загружаемом драйвере операционной системы Solaris 2.5, приведен в табл. 5.2.
Таблица 5.2. Дополнительные функции и структуры данных для загружаемых драйверов
_init() |
Функция инициализации и установки, вызываемая при загрузке драйвера |
_fini() |
Функция, вызываемая перед выгрузкой драйвера, удаляющая его из системы |
_infо() |
Функция, возвращающая информацию о драйвере по запросу ядра |
struct modlinkage |
Структура, используемая функциями _init() , _fini() и _info() при загрузке, выгрузке и получении информации о драйвере |
struct modldrv |
Структура, экспортируемая ядру при загрузке драйвера, в частности, содержит адреса точек входа в драйвер |
Помимо этого Solaris 2.5 предоставляет ряд функций ядра для работы с динамически загружаемыми драйверами: mod_install(9F), mod_remove(9F) и mod_info(9F).
- Встраивание
- 1.7 Иерархия драйверов систем хранения и типы драйверов
- Я слышал, можно менять ядро Windows. Как это сделать?
- У меня нет драйверов для звуковой карты. На самой карте модель не написана. Как найти и установить звуковой драйвер?
- 1.4. Ядро
- Ядро в роли арбитра
- Обновление драйверов
- Встраивание сценариев в рамках элемента SCRIPT
- Семантическое ядро, или ключевые слова
- Драйверы, встроенные в ядро, и драйверы, реализуемые в виде модулей
- Загрузка сетевых драйверов
- Версии UNIX, использующие микроядро