Драйвер устройства в Linux - это программа / процесс или это просто библиотека?


23

Драйвер устройства - это программа, которая запускается сама по себе, или это просто библиотека (группа функций), которая загружается в память, и программы могут вызывать одну из ее функций (поэтому она не запускается сама по себе).

И если это программа, есть ли у нее идентификатор процесса, могу ли я, например, завершить драйвер устройства так же, как я могу завершить любой другой процесс?


1
Вы можете «выгрузить» драйвер с помощью rmmod, но только если он не используется.
pjc50

Ответы:


35

В Linux многие драйверы устройств являются частью ядра, а не библиотек или процессов. Программы взаимодействуют с этими использованием файлов устройств ( как правило , в /dev) и различных системных вызовов , таких как open, read, write, ioctl...

Однако есть исключения. Некоторые драйверы устройств используют смесь заглушек драйверов ядра и библиотек пространства пользователя ( например, используя UIO). Другие реализованы полностью в пользовательском пространстве, обычно поверх некоего интерфейса с битами (UART или GPIO). В обоих случаях они обычно находятся в процессе, поэтому вы не увидите отдельный процесс, а только процесс, использующий устройство.

Чтобы «завершить» драйвер устройства, вам нужно будет остановить все процессы, использующие его, затем удалить его модули ядра (при условии, что он собран как модули) и, необязательно, любые другие модули, которые он использует и которые больше не нужны. Вы можете перечислить модули в вашей системе, используя lsmod, и выгрузить их, используя rmmodили modprobe -r, оба из которых будут работать, только если lsmodу них нет пользователей.


2
Если вы достаточно смелы, и ваше ядро ​​было скомпилировано CONFIG_MODULE_FORCE_UNLOAD, вы можете попытаться rmmod -fпринудительно выгрузить модули, которые используются / не предназначены для удаления / и т. Д. Это, помимо простого вывода ядра в ненадежное состояние, также испортить ядро.
Руслан

9

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

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

Вообще говоря, интерфейсы и протоколы драйверов реализуются с использованием модулей ядра, которые загружаются по мере необходимости, определяемой деревьями устройств или правилами udev. Модуль ядра не является в самом строгом смысле процессом или библиотекой.

Библиотека - это просто статический набор кода, который можно загрузить в любой данный процесс. Современные операционные системы загружают эти библиотеки в общую память. Сам процесс может ссылаться на любое количество разделяемых библиотек.

Процесс - это запущенная программа, в которой системная программа или ядро ​​выделяют такие ресурсы, как системная память и время процессора. Модули ядра могут или не могут следовать этому шаблону сами, но независимо от того, не рассматриваются как дефактные процессы в Linux.

Таким образом, чтобы ответить на ваш вопрос, драйвер не должен быть процессным, но он может быть. Хотя код может существовать в библиотеке, драйвер все равно загружается в мемери через программу, будь то ядро ​​в форме модулей ядра или пользовательских процессов.

Это становится более семантическим аргументом при рассмотрении того, чем на самом деле является совокупность драйвера. Можно сказать, что драйвер - это всегда программа, но иногда это не так, как в случае с деревьями устройств, и это может быть процесс пользователя, файл дерева устройств, правила udev и модуль ядра, где и процесс, и модуль используют библиотеки для создания логика водителя.


0

Драйвер устройства Linux, по сути, является библиотекой пространства ядра . Его вызовы инициируются в основном драйверами более высокого уровня или процессами пользовательского пространства, использующими его.

Есть только несколько исключений из этого:

  • Потоки ядра могут запускаться / останавливаться также драйверами, по сути, это процессы без части пользовательского пространства.
  • Обработчики прерываний инициируются аппаратными средствами, а не процессами пользовательского пространства.

В других системах, как в GNU Hurd, драйверы - это, по сути, демоны, с которыми процессы могут взаимодействовать. В Linux драйверы являются библиотеками. Обе концепции имеют свои преимущества и недостатки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.