Готовый перевод Linux Device Drivers 3 / Драйверы устройств Линукс (третье издание): 3.1. Проектирование scull
3.1. Проектирование scull
Первым шагом написания драйвера является определение возможностей (механизмов), которые драйвер будет предоставлять пользовательским программам. Так как наше "устройство" является частью оперативной памяти компьютера, мы можем делать с ним, что хотим. Оно может стать устройством последовательного или случайного доступа, одним устройством или несколькими и т.п.
Чтобы сделать scull полезным в качестве шаблона написания реальных драйверов для реальных устройств, мы покажем, как реализовать различные абстракции устройств в верхней части памяти компьютера, каждую со своей индивидуальностью.
Исходные коды scull реализуют описанные ниже устройства. Каждый вид устройства обслуживается модулем названного типа.
scull0 до scull3
Четыре устройства каждое из которых состоит из глобальной и постоянной области памяти. Глобальная обозначает, что если устройство открыто несколько раз, данные, содержащиеся в устройстве, являются общими для всех файловых дискрипторов, которые открыли его. Постоянная обозначает, что если устройство будет закрыто или открыто вновь, данные не пропадут. С этим устройством может быть интересно работать, потому что оно может быть доступно и протестировано с использованием обычных команд, таких как cp, cat, и оболочки перенаправления ввода/вывода.
scullpipe0 to scullpipe3
Четыре FIFO (first-in-first-out - первый внутрь - первый наружу) устройства, которые работают как каналы. Один процесс читает то, что написал другой. Если несколько процессов читают одно и то же устройство, они начинают соперничать за данные. Внутренности scullpipe покажут, как может быть реализовано блокирующее и неблокирующее чтение без необходимости прибегать к прерываниям. И хотя реальные драйвера синхронизируются со своими устройствами при помощи аппаратных прерываний, тема блокирующих и неблокирующих операций важна сама по себе отдельно от рассмотрения обработки прерываний (рассматривается в главе 10).
scullsingle
scullpriv
sculluid
scullwuid
Эти устройства похожи на scull0, но имеют некоторые ограничения по правам открытия. Первое (scullsingle) позволяет только одному процессу одномоментно использовать драйвер, в то время как scullpriv является выделенным для каждой виртуальной консоли (или X-терминальной сессии), потому что каждая консоль/терминал получает свои области памяти. Sculluid and scullwuid могут быть открыты многократно, но только одним пользователем одновременно; первое возвращает ошибку "Устройство занято", если устройство блокировано другим пользователем, в то время как второе реализует блокирующее открытие. Эти варианты scull представляются довольно запутанными в смысле политики и механизмов действия, но это стоит того, потому что некоторые реальные устройства требуют такого рода управления.
Каждое из устройств scull демонстрирует различные возможности драйвера и существующие трудности. Эта глава посвящена внутреннему устройству scull0 to scull3; более продвинутые устройства рассматриваются в главе 6. scullpipe описывается в разделе 3.4, остальные - в разделе 6.6.
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется
Переведено на Нотабеноиде
http://notabenoid.org/book/11832/38269
Переводчики: victor8632, hardorsoft
Настройки
Готово:
