Глава 14, Модель устройства в Linux |
Одной из заявленных целей для цикла разработки версии 2.5 было создание для ядра унифицированной модели устройства. Предыдущие ядра не имели единой структуры данных, к которой они могли обращаться для получения информации о том, как система собрана воедино. Вопреки такой нехватки информации, в течение некоторого времени всё работало хорошо. Требования новейших систем, с их более сложными топологиями и необходимостью в поддержке таких функций, как управление питанием, тем не менее, делают ясным, что необходима общая абстракция, описывающая структуру системы.
Модель устройства версии 2.6 обеспечивает такую абстракцию. Сейчас она широко используется в ядре для поддержки широкого спектра задач, включая:
Управление питанием и выключение системы
Это требует понимания структуры системы. Например, адаптер USB узла не может быть закрыт до закрытия всех устройств, подключенных к этому адаптеру. Модель устройства позволяет обход системного оборудования в правильном порядке.
Взаимодействие с пользовательским пространством
Реализация виртуальной файловой системы sysfs тесно связана с моделью устройства и выставляет структуру, предоставленную ей. Предоставление информации о системе для пользовательского пространства и ручек управления для изменения рабочих параметров всё чаще выполняется через sysfs и, следовательно, через модель устройства.
Устройства, подключаемые без выключения системы
Компьютерное оборудование становится все более динамичным; периферийные устройства могут приходить и уходить по прихоти пользователя. Механизм горячего подключения, используемый в ядре для обработки и (особенно) взаимодействия с пользовательским пространством при подключении и отключении устройств, управляется с помощью модели устройства.
Классы устройств
Многие части системы мало заинтересованы в знании того, как устройства подключаются, но им необходимо знать, какие устройства доступны. Модель устройства включает в себя механизм для присвоения устройствам классов, которые описывают эти устройства на более высоком, функциональном уровне и позволяют им быть обнаруженными из пространства пользователя.
Жизненные циклы объектов
Многие функции, описанные выше, имеющие поддержку горячего подключения и sysfs, осложняют создание и манипулирование объектами, созданными в ядре. Реализация модели устройства требует создания набора механизмов, чтобы иметь дело с жизненным циклом объектов, их взаимоотношениями и их представлением в пространстве пользователя.
Модель устройства Linux представляет собой сложную структуру данных. Рассмотрим, например, Рисунок 14-1, который показывает (в упрощённой форме) небольшую часть структуры модели устройства, связанной с USB мышью. Вниз по центру диаграммы мы видим часть дерева ядра "устройств", которое показывает, как мышь подключена к системе. Дерево "шины" прослеживает, что подключено к каждой шине, в то время как поддерево "классы" озабочено функциями, предоставляемыми устройствами, независимо от того, как они подключены. Дерево модели устройства даже на простой системе содержит сотни узлов, похожих на показанные на диаграмме; оно является сложной структурой данных для визуализации в целом.
Рисунок 14-1. Небольшая часть модели устройства
По большей части, код модели устройства в Linux заботится обо всех этих деталях без навязывания себя авторам драйверов. Оно в основном находится на заднем плане; прямым взаимодействием с моделью устройства, как правило, занимается логика шинного уровня и другие разные подсистемы ядра. Как результат, многие авторы драйверов могут полностью игнорировать модель устройства и доверить ей позаботиться о себе самой.
Однако, есть моменты, когда хорошо иметь понимание модели устройства. Есть моменты, когда модель устройства "выходит наружу" из-под других слоёв; например, обычный код DMA (который мы встретим в Главе 15) работает со struct device. Вы можете захотеть использовать некоторые из возможностей модели устройства, таких как подсчёт ссылок и соответствующие возможности, предоставляемые kobjects. Взаимодействие с пользовательским пространством через sysfs также является функцией модели устройства; эта глава рассказывает, как работает такое взаимодействие.
Начнём, однако, с презентации модели устройства снизу вверх. Сложность модели устройства делает её труднопонимаемой при начале просмотра с высоких уровней. Мы надеемся, что показывая, как работают низкоуровневые компоненты устройства, мы сможем подготовить вас к постижению, как используются эти компоненты для построения большой структуры.
Многие читатели могут рассматривать эту главу как дополнительный материал, которые не требует прочтения до конца в первый раз. Тех, кто заинтересовался работой модели устройства Linux призываем, однако, двигаться вперёд, так как мы углубляемся в низкоуровневые детали.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.