Операционная система ЗОСРВ «Нейтрино» > Руководство разработчика > Основные принципы системной разработки > Разработка драйверов и драйверные библиотеки > Драйверные библиотеки > Библиотека разработки драйверов символьных устройств (libio-char) > Общие сведения > Архитектура драйверов символьного ввода вывода



Архитектура драйверов символьного ввода вывода

Рассматриваются общие принципы функционирования драйверов символьных устройств

Список подразделов:

Обзор
Текущая архитектура
Взаимодействие библиотеки io-char и драйвера

Обзор

На данный момент каждый драйвер является отдельным процессом. Каждый драйвер ссылается на библиотеку libio-char.a.

Большинство наших драйверов символов однопоточные, однако запросы на чтение и запись не блокируют друг друга.

Когда поступает запрос на чтение, библиотека io-char проверяет свои буферы ввода (EDITED или RAW, в зависимости от режима файлового дескриптора). Если данных достаточно для удовлетворения запроса, библиотека вызывает MsgReply() для отправки ответа и продолжает работу. Если данных недостаточно или уже выполняется другой запрос на чтение, запрос помещается в список ожидающих запросов на чтение, и драйвер возвращается к MsgReceive(), чтобы обрабатывать другие запросы. Когда оборудование предоставляет достаточно данных для выполнения чтения (определяемое по прерываниям получения данных), запрос извлекается из списка ожидания и обрабатывается.

Когда поступает запрос на запись, драйвер помещает максимальное возможное количество данных в выходной буфер. Если данные остаются, запрос добавляется в список ожидающих запросов на запись. По мере передачи оборудования символов из выходного буфера оставшиеся данные копируются из запроса записи до тех пор, пока все не будут обработаны. После этого драйвер вызывает MsgReply(), чтобы завершить запрос на запись.

Благодаря спискам ожидания запросов на чтение и запись драйвер никогда не блокируется на оборудовании; он всегда возвращается к MsgReceive() и остается доступным для обработки других клиентов.

Текущая архитектура

Библиотека io-char вызывает функцию tto(), которую реализует драйвер. Функция tto() записывает данные для передачи (tx data), статус линии, настройки устройства и информацию управления линией в оборудование. Структуры TTYCTRL и TTYDEV обеспечивают интерфейс между библиотекой io-char и драйвером.

Драйвер вызывает функции ttc(), tti() и tti2(). Функция ttc() используется для инициализации устройства и менеджера ресурсов, а функции tti() и tti2() передают данные приема и управляющую информацию в библиотеку io-char.

Функция tte() вызывается событием, которое активирует обработчик событий библиотеки io-char.

functions.png
Рисунок 1. Взаимодействие io-char и драйвера

Структура TTYDEV содержит два буфера: obuf (выходной буфер) и ibuf (входной буфер).

Функция tto() обеспечивает интерфейс между регистром Tx FIFO и obuf, а функции tti() и tti2() обеспечивают интерфейс между регистром Rx FIFO и ibuf.

buffers.png
Рисунок 2. Взаимодействие функции

Взаимодействие библиотеки io-char и драйвера

Функции, реализуемые драйвером:

Функции, вызываемые драйвером:

События, генерируемые драйвером:




Предыдущий раздел: Библиотека разработки драйверов символьных устройсв