Драйверы устройств |
Драйвер 3OS выполняется в своем адресном пространстве и изолирован от ядра и других приложений. Если драйвер обслуживает физическое устройство, которое может генерировать прерывания, то он экспортирует в ядро функцию "распознавания" своего прерывания. Функция "распознавания" прерывания определяет, должен ли драйвер обработать возникшее прерывание. Эта функция должна быть реализована в "перемещаемом" (Position Independence) виде, т. е. без привязки к адресам. Если эта функция "распознает" прерывание как "свое", ядром ОС вызывается функция обработки прерывания из сегмента кода драйвера.
Драйвер 3OC представлен TSS, являющейся контекстом функции обработки прерывания данного драйвера и снабжен кроме собственного стека, дополнительным стеком уровня ядра (уровня 0) величина, которого нормирует максимальную вложенность процедуры обработки (рекурсивность). Таким образом, сама процедура обработки прерывания должна обладать свойством рекурсивности, т. е. как минимум не модифицировать глобальных переменных, как максимум вообще их не иметь.
Ядро по запросу драйвера может отобразить диапазон физических адресов (памяти или портов) на адресное пространство драйвера. Драйвер взаимодействует с ядром посредством системных вызовов - IPC и других. С приложениями драйвер взаимодействует посредством IPC.
Доступ к драйверу из приложений (или других драйверов) осуществляется только через IPC. При этом приложение посылает потоку драйвера сообщение с соответствующим запросом. Выполнив запрошенную функцию, драйвер посылает сообщение с результатом операции вызывавшему потоку приложения.
Для поиска конкретного драйвера должно быть реализовано специальное приложение (модуль ядра) - DeviceManager (DM). DM ведет список всех загруженных драйверов, ID их потоков и символических ссылок. DM реализует следующие сервисные функции:
При загрузке драйвер должен зарегистрироваться в DM, а при завершении своей работы разрегистрироваться. Приложения перед обращением к драйверу должны выяснить ID его рабочего потока.
Каждый драйвер должен поддерживать выполнение таких функций:
Смысл, вкладываемый конкретным драйвером в соответствующую функцию, зависит от устройства, которое обслуживает драйвер. В свете ООП следует рассматривать эти функции как виртуальные.
Естественно, не все функции "логически" применимы к любым устройствам, впрочем, это вопрос разработчика драйвера. При запросе приложения номер вызываемой функции передается в соответствующей позиции сообщения.
Функция read читает время, write записывает время. Функция ioctl устанавливает формат времени, устанавливает будильник и т. п.
Названия функций говорят сами за себя.
В функции ioctl производится настройка устройства и драйвера. Драйверы настраивается для отправки сообщений заинтересованным потокам при нажатии на клавиши или движении мыши.
Функция write из переданных данных формирует frame и ставит его в очередь на отправку. Функция ioctl настраивает драйвер для пересылки данных из полученных frame заинтересованным потокам.