Модуль ядра - это немного скомпилированного кода, который может быть вставлен в ядро во время выполнения, например, с помощью insmod
или modprobe
.
Драйвер - это фрагмент кода, который запускается в ядре для связи с некоторым аппаратным устройством. Он "гонит" железо. Почти каждое устройство на вашем компьютере имеет связанный с ним драйвер. Большая часть работающего ядра - это код драйвера.
Драйвер может быть встроен статически в файл ядра на диске. Драйвер также может быть встроен как модуль ядра, чтобы его можно было динамически загрузить позже. (А потом может быть выгружен.)
Стандартная практика - создавать драйверы как модули ядра, где это возможно, а не связывать их статически с ядром, поскольку это дает большую гибкость. Однако есть веские причины не делать этого:
Иногда данный драйвер абсолютно необходим для загрузки системы. Это происходит не так часто, как вы можете себе представить, благодаря функции initrd .
Статически построенные драйверы могут быть именно тем, что вы хотите в статически ограниченной системе, такой как встроенная система . То есть, если вы заранее точно знаете, какие драйверы всегда будут нужны, и что это никогда не изменится, у вас есть веская причина не беспокоиться о динамических модулях ядра.
Если вы собираете ядро статически и отключаете функцию динамической загрузки модулей в Linux, вы предотвращаете изменение кода ядра во время выполнения. Это обеспечивает дополнительную безопасность и стабильность за счет гибкости.
Не все модули ядра являются драйверами. Например, относительно недавняя функция ядра Linux заключается в том, что вы можете загрузить другой планировщик процессов . Другой пример состоит в том, что более сложные типы оборудования часто имеют несколько общих уровней, которые находятся между драйвером аппаратного обеспечения низкого уровня и пользовательским пространством, таким как драйвер USB HID , который реализует определенный элемент стека USB , независимый от базового оборудования.
Asides:
Единственное исключение из этого широкого утверждения является чипом процессора, который не имеет «драйвера» как таковые . Ваш компьютер также может содержать оборудование, для которого у вас нет драйвера.
Остальная часть кода в ядре ОС предоставляет общие сервисы, такие как управление памятью , IPC , планирование и т. Д. Эти сервисы могут в первую очередь обслуживать пользовательские приложения, как это было в предыдущих примерах, или они могут быть внутренними сервисами, используемыми драйверами или другими внутренними приложениями. инфраструктура ядра.
Один /boot
вход, загруженный в ОЗУ во время загрузки загрузчиком в начале процесса загрузки .
man lspci
: "-k Показать драйверы ядра, обрабатывающие каждое устройство, а также модули ядра, способные его обрабатывать ." Вы можете прочитать это как: «Показать драйвер, который в данный момент / фактически обрабатывает устройство, а также все модули, которые могут / предназначены для его обработки ”.Чтобы ответить на ваш конкретный вопрос о
lspci
выводе, строка «драйвер ядра» указывает, какой драйвер в данный момент связан с картой, в данном случае проприетарнымnvidia
драйвером. В строке «модули ядра» перечислены все драйверы, о которых известно, что они могут быть привязаны к этой карте. Здесь, проприетарный драйвер показывает его другое имя, вероятно, из-за того, как былlspci
найден драйвер и его имя файла по сравнению с именем, закодированным в самом драйвере.источник
man lspci
- там написано именно то, что вы написали.Согласно этому хорошему уроку :
Итак, если мы попытаемся нарисовать дерево, у нас будет «Драйвер устройства», который наследуется от (расширяет) модуля и имеет более специфические характеристики, между которыми мы находим «доступ к оборудованию» ...
источник
Модуль ядра может вообще не быть драйвером устройства.
«Драйвер ядра» - не очень четко обозначенный термин, но давайте попробуем.
Это модуль ядра, который не управляет каким-либо оборудованием, и, следовательно, не может рассматриваться как «драйвер устройства»:
После сборки вы можете использовать его с:
и это печатает
hello init
наdmesg
.Однако существуют модули ядра, которые не являются драйверами устройств, но на самом деле полезны, например, модули, которые предоставляют информацию об отладке / производительности ядра.
Драйверы устройств обычно также являются модулями ядра.
Пример чего-то, что является «драйвером устройства», генерировать немного сложнее, поскольку для его работы требуется аппаратное обеспечение, а описания аппаратного обеспечения, как правило, сложны.
Однако используя QEMU или другие эмуляторы, мы можем создавать программные модели из реального или упрощенного аппаратного обеспечения, что является отличным способом научиться общаться с аппаратным обеспечением. Вот простой пример минимального драйвера устройства PCI: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
Затем мы видим, что в x86 общение с оборудованием сводится к:
in
иout
инструкции, например, https://stackoverflow.com/questions/3215878/what-are-in-out-instructions-in-x86-used-for/33444273#33444273Эти операции, как правило, не могут быть выполнены из пользовательского пространства , как объяснено в разделе: В чем разница между пространством пользователя и пространством ядра? Однако есть некоторые исключения: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .
Затем ядро предлагает API более высокого уровня, чтобы сделать такое аппаратное взаимодействие более простым и переносимым:
request_irq
обрабатывать прерыванияioreadX
и отображение памяти ввода-выводаисточник
Мой ответ пойдет с Джимом. Драйвер ядра - это программа (модуль ядра), предназначенная для управления частью аппаратного обеспечения. Вывод lspci говорит, что nvidia - это драйвер ядра, так как это
loaded
модуль для устройства. Наряду с этим доступны другие доступные модули ядра.Добавлю, что команды в linux для вывода списка и удаления драйверов есть
lsmod
иrmmod
соответственно. Что говорит список модулей и удалить модуль.источник
Все Драйверы являются модулями. Не все модули являются драйверами.
Модули могут быть вставлены во время выполнения. Модули / Драйверы могут быть статически скомпилированы вместе с ядром.
Типичный модуль init имеет
Этот же модуль можно сделать драйвером
источник