Встраивание драйверов в ядро
Драйвер устройства является частью кода ядра операционной системы и обеспечивает взаимодействие других подсистем UNIX с физическими или псевдоустройствами. Существует два основных метода встраивания данных драйвера в ядро операционной системы: перекомпиляция кода позволяющая статически поместить драйвер, и динамическая загрузка драйвера в ядро в процессе работы системы.
Традиционно для встраивания драйвера в ядро UNIX требуется перекомпиляции
ядра и перезапуск системы. Принципиально эта процедура не
отличается от компиляции обычной программы, все компоненты ядра яв-
ляются модулями и редактор связей объединяет их с объект-
тным модулемдрайвера для получения исполняемого файла. В этом случае
драйвер встраивается в ядро статически, т. е. независимо от фактического
наличия устройства и ряда других причин, код и данные драйвера будут присутствовать в ядре UNIX до следующей перекомпиляции.
Однако тенденция развития современных версии операционной системы LINUX заключается в предоставлении возможности динамического расширения функциональности ядра. Это, в частности, относится к файловой системе драйверам устройств и сетевым протоколам (точнее, драйверам системы STREAMS). Возможность работы с новыми периферийными устройствами без необходимости перекомпиляции ядра обеспечивается служебными драйверами. Вместо того чтобы встраивать модуль драйвера, основываясь на статических таблицах и интерфейсах, ядро содержит набор функций, позволяющих загрузить необходимые драйверы и, соответственно выгрузить их, когда необходимость работы с данным устройством отпадает. При этом структуры данных для доступа к драйверам устройств также являются динамическими.
Динамическая установка драйвера в ядро операционной системы требует
выполнения следующих операций:
-
Размещение и динамическое связывание символов драйвера. Эта операция аналогична загрузке динамических библиотек, и выполняется специальным загрузчиком.
-
Инициализация драйвера и устройства.
-
Добавление точек входа драйвера в соответствующий коммутатор устройств.
-
Установка обработчика прерываний драйвера.
Естественно, код динамически загружаемых драйверов сложнее, и содержит
помимо стандартных точек входа, ряд функций, отвечающих за загрузку и выгрузку драйвера, а также ряд дополнительных структур. Пример
дополнительных функций и структур данных, которые должны быть
определены в динамически загружаемом драйвере операционной системы
- Подсистема ввода/вывода
- Драйверы устройств
- Типы драйверов
- Базовая архитектура драйверов
- Файловый интерфейс
- Vnode а также inode физической файловой системы, где расположен специальный файл устройства, и соответствующий ему vnode.
- Встраивание драйверов в ядро
- Блочные устройства
- Символьные устройства
- Интерфейс доступа низкого уровня
- Буферизация
- Архитектура терминального доступа
- Псевдотерминалы