Дизайн scull |
Предыдущая Содержание Следующая |
Первым шагом написания драйвера является определение возможностей (механизма), которые драйвер будет предлагать пользовательским программам. Так как наше "устройство" является частью памяти компьютера, мы свободны делать всё, что хотим. Это может быть устройство с последовательным или случайным доступом, одно устройство или много, и так далее.
Чтобы сделать scull полезным в качестве шаблона для написания настоящих драйверов для реальных устройств, мы покажем вам, как реализовать несколько абстракций устройств поверх памяти компьютера, каждая со своими особенностями.
Исходный код scull реализует следующие устройства. Каждый вид устройства реализуется модулем соответствующего типа.
scull0 ... scull3 Четыре устройства, каждое содержит область памяти, которая одновременно и глобальная и стойкая. Глобальная означает, что если устройство открыто несколько раз, данные, содержащиеся в устройстве, является общими для всех файловых дескрипторов, которые открыли его. Стойкое означает, что если устройство закрыть и вновь открыть, данные не потеряются. С этим устройством может быть интересно поработать, потому что оно может быть доступно и проверено с помощью обычных команд, таких как cp, cat и перенаправления ввода/вывода командной оболочки.
scullpipe0 ... scullpipe3 Четыре FIFO (first-in-first-out, первый вошёл-первый вышел) устройства, которые работают как трубы. Один процесс читает то, что другой процесс пишет. Если несколько процессов читают одно устройство, они состязаются за данные. Внутренности scullpipe покажут, как блокирующие и неблокирующие чтение и запись могут быть реализованы без необходимости прибегать к прерываниям. Хотя реальные драйверы синхронизируются с их устройствами используя аппаратные прерывания, тема блокирующих и неблокирующих операций сама по себе является важной и рассматривается отдельно от обработки прерываний (рассматриваемых в Главе 10).
scullsingle scullpriv sculluid scullwuid Эти устройства похожи на scull0, но с некоторыми ограничениями на разрешение открытия. Первое (scullsingle) разрешает использование драйвера только одному процессу, в то время как scullpriv является единственным для каждой виртуальной консоли (или X терминальной сессии), так как процессы каждой консоли/терминала получают разные области памяти. sculluid и scullwuid могут быть открыты несколько раз, но только одним пользователем за раз; первый возвращает ошибку "устройство занято", если другой пользователь блокирует устройство, в то время как второй реализует блокировку открытия. Эти вариации scull, казалось бы, путают политику и механизмы, но они заслуживают рассмотрения, потому что некоторые устройства в реальной жизни требуют такого рода управления.
Каждое из устройств scull демонстрирует различные функции драйвера и представляет различные трудности. Эта глава охватывает внутреннее строение от scull0 до scull3; более совершенные устройства будут рассмотрены в Главе 6. scullpipe описан в разделе "Пример блокирующего ввода/вывода", а остальные описаны в "Контроль доступа к файлу устройства". |
Предыдущая Содержание Следующая |