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

Поскольку вы отметили этот вопрос с помощью awk , почему бы просто не использовать awk ?

$ awk '
    BEGIN{RS=FS="\\W+"}
    $0==t{printf("%s:%s\t%s %s\n", FILENAME, FNR, t, $0)}
    {t=$0}
' *.txt
highlander_typo.txt:6   one one
jefferson_typo.txt:3    has has
jefferson_typo.txt:29   and and
jefferson_typo.txt:42   be be
kylie_minogue.txt:3 la la

Я не сохранил новую строку в jefferson_typo.txt , потому что он не визуально полезен для меня, но вы можете настроить его по своему вкусу.

6
12.05.2017, 21:58
2 ответа

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

Да, примерно так.

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

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

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

0
27.01.2020, 20:28

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

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

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

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

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

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

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

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

Это поможет?

Редактировать:

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

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

6
27.01.2020, 20:28

Теги

Похожие вопросы