Драйверы устройств образуют интерфейс между API-интерфейсом устройства операционной системы и реальными аппаратными регистрами.
Модель API устройства linux является продолжением более широкой концепции linux, согласно которой все является файлом и что приложение может выполнить все, что ему нужно, с помощью open (), read (), write (), ioctl (), и закрыть () интерфейс. Под капотом есть процедура install (), но ОС решает, когда ее вызвать.
Другая сторона медали аппаратная. Процессор осуществляет доступ к регистрам устройства либо с помощью специальных инструкций ввода / вывода, либо с помощью обычных обращений к памяти в специальных местах памяти, которые подключены к оборудованию. Хотя аппаратные регистры могут действовать как память, они могут делать то, что не может память. Довольно часто запись в один из регистров устройства может изменять значения некоторых других его регистров и, в сущности, может изменяться или изменяться в результате электрической активности в подключенном оборудовании.
Драйверы устройств устраняют этот пробел. Поскольку возможности для типов устройств практически не ограничены, трудно обобщить, как отображаются функции, за исключением нескольких пунктов. Процедура install () запускается во время запуска системы, настраивает регистры для правильной работы, обычно это включает настройку службы обработки прерываний и обработку; подпрограмма open () дает приложению логическое соединение с устройством; обычно делается попытка заставить read () и write () перемещать данные каким-либо разумным способом, хотя иногда вы видите, что они реализованы как no-ops; и настройки устройства «на лету» обрабатываются через ioctl (). И, конечно же, основная задача close () - отменить работу open (), уделяя особое внимание освобождению любых системных ресурсов, захваченных open ().
Ну, во всяком случае, это ориентированный на Linux. Модель Windows, по крайней мере та, с которой я знаком (вероятно, датирована), имеет тенденцию предлагать библиотеки вызовов функций для конкретных устройств.