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

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

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

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

Правильно ли я понимаю? И понятие 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 нет на самом деле драйверов устройств для принтера для большинства большинства принтеров. (Для нескольких принтеров вам может понадобиться один).

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

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

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

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

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

  • Сделать установку изменения ядра ядра Linux
  • Разрешение адресов трассировки исполняемого файла пользователя в ftrace
  • Значение определенных папок в дереве ядра linux
  • Недопустимый формат модуля
  • Ядро и QEMU: невозможно установить ошибку root fs
  • Какова минимальная версия ядра, на котором будет запускаться ARM Slackware 14.0?
  • Являются ли потоки ядра Linux действительно ядрами?
  • Проблема с отображением в бесконечной ОС
  • Как узнать, какие алгоритмы декомпрессии скомпилированы в ядро ​​linux?
  • Где я могу найти конфигурацию ядра в каждом дистрибутиве Linux?
  • Ядро: поддержка пространств имен
  • Interesting Posts

    Установка NetworkManager без подключения к Интернету

    Как grep рекурсивно в порядке последнего модифицированного времени?

    Текстовый редактор для печати кода на C ++

    Вопрос о wlan0 / eth0 и wirehark

    Что происходит, когда объем tmpfs заполнен и swap заполнен? Включен ли OOM-убийца Linux?

    Как я могу сделать коммутатор доступным через Интернет, который позволяет пользователям включать или выключать скрипт python?

    Должен ли я использовать acct Linux (учет процесса BSD) для отслеживания поведения процесса?

    1 FastCGI, отправленный в stderr: «Сообщение PHP: PHP Неустранимая ошибка: session_start (): Не удалось инициализировать модуль памяти:

    Разделение столбцов и представление значения как stdin в отдельную программу в скрипте

    Как удалить последнюю строку из всех файлов из каталога?

    xbindkeys Вставить скрипт не получается

    Как изменить нижний файл через каталог OverlayFS?

    Как включить пакеты админ-пакетов vim?

    Двойная квадратная скобка внутри шаблона grep

    Редактирование отсутствующих символов в некоторых charmap / клавиатурах

    Linux и Unix - лучшая ОС в мире.