
лекции, учебные пособия / материалы к собеседованию / вводивывод
.docВвод/ввывод
Типы драйверов — символьные и блочные
Устройства — символьно-орентированные и блочно-орентированные
Драйверы — обеспечивают интерфейс между ядром и аппаратной частью компьютера
-
Символьные — доступ побайтно, не буферизированы (принтеры терминалы). Буферизация с помощью clist (состоит из полей с_сс — число символов в буфере, все остальные поляуказывают на 1 и последний элементы cblock, который хранит несколько символов)
-
Блочные — обмен блоками, буферизированный кэш, (жесткий диск). Делятся на те что используют файловую систему и нет. Для последних доступ осуществляется с помощью спец. Файла устройства, доступ к первым только при размонтированной файловой системе. Доступ — xxopen, xxclose, xxstrategy(отвечает за ввод-вывод)
-
Низкого уровня — вид блочных, но без буфера
Программные драйверы или драйверы псевдоустройств - /dev/mem(доступ к физ. Памяти), /dev/null (нулевое устройство)
mknod /dev/tty13 c 2 13 (c-символьный, 2 — старший номер, 13 — младший номер)
старший — адресуется самим драйвером устойства (указатель на элемент коммутатора)
младший — интерпретируется самим драйвером (для клонов или разделы жесткого диска)
Доступ к драйверу с помощью коммутатора устройств (определяет базовый интерфейс драйвера устройств) каждый элемент содержит точки входа.
Коммутатор — bdevsw (для блочных) и cdevsw (для символьных)
Точки входа — определяют префикс функций (mmopen, mmclose)
Обращение ядра к функциям драйвера
-
автоконфигурация (определение какие устройства доступны)
-
ввод-вывод
-
обработка прерываний
-
специальные запросы
-
реинциализация или останов
Драйвер состоит из верхней и нижней половины
-
верхняя — вызывается по определенным запросам прикладного процесса и выполняются в его контексте (синхронный характер, ввод-вывод, управление)
-
нижняя — выполнение функций происходит в контексте ядра и обычно не имеет никакого отношения к контексту текущего процесса (асинхронный характкр, обработка прерываний)
Клоны
Использование различных младших номеров (который соответствует логическому драйверу) позволяет нескольким процессам одновременно и независимо работать с устройством.
Выбор младшего номера
-
перебор различных младших номеров, пока функция open не завершится успешно
-
пооиск возлагается на драйвера клонов (имеют один и тот же старший номер, а младший номер адресует собственно драйвер, представляя собой старший номер реального устройства для которого создается клон
Встраивание драйверов в ядро
-
статически (перекомпиляция ядра и перезапуск системы)
-
динамически ( размещение и связывание символов драйвера, инциализация драйвера и устройства, добавление точек входа в коммунатор устройства, установка обработчика прерываний)
Подсистема STREAMS
Представляет интерфейс обмена данными, основанный на сообщениях и обеспечивает стандартные механизмы буферизации, управление потоком данных и различную приоритетность обработки. Подсистема STREAMS обеспечивает создание потоков — полнодуплексных каналов между прикладным процессом и драйвером устройства. Поток состоит из головного модуля (взаимодействет с процессами через интерфейс системных вызовов, задачи — трансляция данных, сообщения об ошибках и отправка сигналов процессам, распаковка сообщений), модули обрабатывают информацию, драйвер замыкающий поток взаимодействует с физ. устройством. Передача по потоку в виде сообщений (содержат данные, тип сообщения и управляющую информацию, описывается заголовком сообщения и заголовком блока данных), для передачи имеютя 2 очереди — очередь записи и очередь чтения .
Типы сообщений
-
обычные
-
приоритетные (всегда помещаются перед обычными сообщениями)
Управление передачей данных обеспечивается с помощью функций xxput и xxservice(необязательная)
Управление потоком с помощью системного вызова ioctl
Подсистема так же обеспечивает возможность мультиплексирования потоков.
Типы мультиплексоров
-
верхний ( обеспечивает мультиплексирование вверх по потоку)
-
нижний ( обеспечивает мультиплексирование вниз по потоку)
-
гибридный ( обеспечивает мультиплексирование вверх и вниз по потоку)