Попытка понять, как работают драйверы устройств

Я пытаюсь понять, как работают драйверы устройств, основанные на том, что я знаю до сих пор, Драйвер устройства – это просто «средний человек» между операционной системой и устройством. Я привел следующую диаграмму, чтобы показать мое понимание драйверов устройств:

введите описание изображения здесь

Кроме того, приложение не может напрямую взаимодействовать с драйвером устройства, но только операционная система может это сделать (например, если приложение хочет что-то напечатать, оно «сообщает» операционной системе, а операционная система сообщает драйверу устройства).

Правильно ли я понимаю? И понятие Device Drivers одинаково для Windows и MacOS, как и для Linux?

2 Solutions collect form web for “Попытка понять, как работают драйверы устройств”

Очень кратко:

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

Таким образом, вы можете думать о драйверах устройств как о части ядра, которые организуют доступ к определенному оборудованию («устройство»).

Приложение может взаимодействовать с ядром на разных уровнях: от более высоких абстракций (например, файловой системы) до средних абстракций (блочное устройство) до абстракций с низким уровнем (некоторые файлы в /proc/ или /sys , некоторые ioctls в устройствах в /dev ). Таким образом, взаимодействие на низком уровне иногда будет напрямую связано с драйвером устройства, есть только очень тонкий слой, где ядро ​​перенаправляет вызов на драйвер устройства. Таким образом, «приложение не может напрямую взаимодействовать с драйвером устройства, только операционная система может это сделать» – это тип истины, а также своего рода ложь.

Кроме того, в ядре есть много слоев абстракции, подобных тому, которое вы описываете на своем снимке («сообщения, отправляемые ОС, одинаковы, драйвер устройства использует разные сообщения для разговора с аппаратным обеспечением). Например, блочный уровень получает один но передает их на разные блочные устройства. Уровень USB получает один вид сообщений, но может использовать разные контроллеры хоста USB. И так далее.

Таким образом, картина намного сложнее, в ядре есть слои и подсистемы, а драйверы устройств, которые на самом деле разговаривают с оборудованием, находятся в нижней части этой иерархии. Чтобы запутать больше, как драйверы устройств, так и другие слои поставляются в виде модулей (для Linux). Если вы lsmod , вы увидите, какие модули активны, а какой модуль использует другие модули.

Кроме того, печать – очень плохой пример; большая часть обработки, зависящей от принтера, происходит в пространстве пользователя, а не в драйвере устройства.

Все Windows, Linux и MacOS следуют этим принципам, но детали очень разные.

Это помогает?

Изменить :

Печать на Linux сегодня обычно делается с помощью чашек . В чашках есть набор программ, которые могут отображать документы для разных принтеров. Все эти программы берут файл (документ как pdf / postscript / …) и преобразуют его в другой файл в том формате, который понимает принтер. Все это происходит за пределами ядра, потому что ничто из этого не требует доступа к реальному оборудованию. Он просто читает и записывает файлы. Только последняя часть, когда преобразованные данные отправляются на принтер, использует ядро. И тогда он может использовать разные пути даже для одного и того же типа принтера: через сеть, через USB, через последовательное соединение и т. Д. И эта последняя часть часто не зависит от принтера.

Таким образом, у Linux нет на самом деле драйверов устройств для принтера для большинства большинства принтеров. (Для нескольких принтеров вам может понадобиться один).

Драйвер устройства – это просто «средний человек» между операционной системой и устройством.

Да, это более или менее.

Драйверы устройств – это «черные ящики», которые транслируют стандартизованные вызовы программирования для конкретных операций устройства аппаратного компонента.

Таким образом, программе не нужно знать внутреннюю работу определенного аппаратного обеспечения; это конкретный драйвер устройства, который будет делать сопоставление прозрачным способом, позволяя программе «разговаривать» с оборудованием.

Они создаются отдельно от ядра и активируются (как модули, загружаемые в ядро), когда это необходимо.

  • Невозможно выполнить компиляцию модуля ядра: нет правила для создания целевого дроида / sunxi-livesuite-master / awusb ''
  • Что такое заголовки ядра Linux?
  • Как мне вернуться к предыдущему ядру Ubuntu? (работает Ubuntu 16.04)
  • Что происходит на каждом этапе процесса создания ядра Linux?
  • Ядро: поддержка пространств имен
  • Является ли oops ядра, зараженного промежуточным устройством, менее вероятным для изучения?
  • Автоматически включать N последних версий ядра в меню GRUB / GRUB2 при обновлении ядра
  • Почему существует множество систем BSD, но только одно ядро ​​Linux?
  • Как я могу переопределить параметры ядра по умолчанию для mount?
  • Запуск аппаратных прерываний путем подключения параллельных портов 9 и 10 не работает
  • Как получить linux-gate.dso в новой Linux-системе?
  • Linux и Unix - лучшая ОС в мире.