Каково различие между модулями ядра и драйверами ядра?

Причина Вы не можете найти его в репозитории об/мин запаса, который идет с CentOS, состоит в том, что rtorrent является традиционно настольным приложением даже при том, что это - базирующаяся командная строка. CentOS является завершением Red Had Enterprise Linux, который не включает приложения как rtorrent. Быстрый поиск онлайн и я не мог найти репозитории сторонних производителей для CentOS, который включал rtorrent.

Мое персональное предложение состоит в том, чтобы использовать Fedora, который все еще основан на архитектуре Red Hat, но включает намного более широкий диапазон пакетов включая rtorrent.

67
05.09.2012, 11:24
6 ответов

Модуль ядра является небольшим количеством скомпилированного кода, который может быть вставлен в ядро во времени выполнения, такой как с insmod или modprobe.

Драйвер является небольшим количеством кода, который работает в ядре, чтобы говорить с некоторым устройством. Это "управляет" аппаратными средствами. Почти каждый бит аппаратных средств в Вашем компьютере имеет связанный драйвер. ¹ значительная часть рабочего ядра код драйвера. ²

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

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

  • Иногда данный драйвер абсолютно необходим для помогания начальной загрузке системы встать. Этого не происходит так часто, как Вы могли бы вообразить, из-за initrd функции.

  • Статически созданные драйверы могут быть точно, что Вы хотите в системе, которая статически ограничена по объему, такие как встроенная система. То есть, если Вы знаете заранее точно, какие драйверы всегда будут необходимы и что это никогда не будет изменяться, у Вас есть серьезное основание не обеспокоиться динамическими модулями ядра.

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

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


Asides:

  1. Одним исключением к этому широкому оператору является микросхема ЦП, которая не имеет никакого "драйвера" по сути. Ваш компьютер может также содержать аппаратные средства, для которых у Вас нет драйвера.

  2. Остальная часть кода в ядре ОС предоставляет универсальные услуги как управление памятью, IPC, планирование, и т.д. Эти сервисы могут, прежде всего, обслуживать приложения пространства пользователя, как с примерами, связанными ранее, или они могут быть внутренними сервисами, используемыми драйверами или другой инфраструктурой внутриядра.

  3. Тот в /boot, загруженный в RAM во время начальной загрузки загрузчиком рано в процессе начальной загрузки.

78
27.01.2020, 19:31
  • 1
    могут быть файловыми системами, сетевыми протоколами, техническими возможностями брандмауэра, и многое другое. Некоторые аппаратные средства (например, карты WiFi) требуют стопки модулей, некоторая предлагающая общая инфраструктура, в то время как другие обрабатывают сами аппаратные средства. –  vonbrand 30.12.2015, 16:48
  • 2
    Это - хорошая общая схема, но я имел точно тот же вопрос как OP, затем столкнулся с этим ответом и все еще не знал, почему "драйвер, используемый", отличается от "модулей". Напротив, @Jim ответ Парижа корректно. От man lspci: "Выставочные драйверы ядра-k, обрабатывающие каждое устройство и также модули ядра, способные к обработке его". Вы могли считать что как: "Показывайте драйвер в настоящее время / на самом деле обработка устройства и также всех модулей, которые могли / быть предназначенными для обработки его". –  Binarus 27.12.2017, 18:38

Отвечать на Ваш конкретный вопрос о lspci вывод, строка "драйвера ядра" относится, к которому драйвер в настоящее время связывается с картой, в этом случае собственное nvidia драйвер. "Строка" модулей ядра перечисляет все драйверы, которые, как известно, были способны к привязке к этой карте. Здесь, собственный драйвер разоблачает его другое имя, вероятно, из-за как lspci найденный драйвером и его именем файла по сравнению с именем, кодированным в сам драйвер.

18
27.01.2020, 19:31
  • 1
    Спасибо - который помог. Если я только вышел man lspci - это говорит точно, что Вы записали. –  Binarus 27.12.2017, 18:40

Мой ответ пойдет с Jim. Драйвер ядра является программой (модуль ядра), который разработан для управления частью аппаратных средств. Вывод lspci говорит, что Nvidia является драйвером ядра, как это loaded модуль для устройства. Наряду с ним прибывает другие доступные доступные модули ядра.

Я добавлю, что команды в Linux, чтобы перечислить и удалить драйверы lsmod и rmmod соответственно. Который говорит модуль списка, и удалите модуль.

0
27.01.2020, 19:31

Все Драйверы являются модулями. Не все модули являются драйверами.

Модули могут быть вставлены во времени выполнения. Модули/Драйверы могут быть статически скомпилированы наряду с ядром также.

Типичный модуль init имеет

module_init(init_fn);
init_fn()
{
   /* some code */
}

Тот же модуль может быть сделан драйвером

module_init(init_fn);
init_fn()
{
   device_register(&device);
   /* some code */
}
0
27.01.2020, 19:31
  • 1
    являются не всегда модулями, они могут быть включены в основное изображение ядра. –  Gilles 'SO- stop being evil' 06.09.2012, 01:06
  • 2
    @Prabagaran: "Все Драйверы являются модулями. Все модули не являются драйверами". Это является противоречащим. В математическом элементе, что Вы говорите, D-> M и M->! D. Это допускает D и! D. –  Francesco Turco 13.09.2012, 13:50
  • 3
    я думаю, что он имеет в виду "Все драйверы, является модулями. Не все модули являются драйверами". –  Renan 14.09.2012, 04:29
  • 4
    @Renan: Это было бы корректно, но если Вы смотрите на историю редактирования для этого ответа, кто-то уже попытался зафиксировать ошибку, и автор вернулся он. Обычно я просто отредактировал бы для фиксации ошибки и движения, но в этом случае у меня есть-1'ed, потому что это просто неправильно и сбивает с толку проблема. большое спасибо –  Caleb 25.09.2012, 14:39
  • 5
    Как я помню (не дурачились в некоторое время) существуют некоторые драйверы, которые не могут быть созданы как загружаемые модули. Я, кажется, помню других, которые могут только быть обработаны как модули. –  vonbrand 30.12.2015, 16:54

Согласно этому хорошему учебному руководству:

... один тип модуля является драйвером устройства, который позволяет ядру получать доступ к аппаратным средствам, подключенным к системе.

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

5
27.01.2020, 19:31
  • 1
    Это только частично корректно. Драйвер является объектом класса в иерархии (да, Linux' внутренний дизайн, как актуальнейшие операционные системы, объектно-ориентирован). Но сказал, что драйвер мог бы быть модулем (загружаемый во времени выполнения) или скомпилированный в ядро. Существует не (или очень мало) различие между альтернативами, мудрый код. –  vonbrand 30.12.2015, 16:52

Модуль ядра может вообще не быть драйвером устройства.

Термин «драйвер ядра» не вполне определен, но давайте попробуем.

Это модуль ядра, который не управляет каким-либо аппаратным обеспечением, поэтому его нельзя разумно считать «драйвером устройства»:

#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");

static int myinit(void)
{
    printk(KERN_INFO "hello init\n");
    return 0;
}

static void myexit(void)
{
    printk(KERN_INFO "hello exit\n");
}

module_init(myinit)
module_exit(myexit)

После сборки вы можете использовать его с:

insmod hello.ko

и он печатает hello initв dmesg.

Однако существуют модули ядра, которые не являются драйверами устройств, но на самом деле полезны, например, модули, предоставляющие информацию об отладке ядра/производительности.

Драйверы устройств обычно также являются модулями ядра.

Пример чего-то, что является «драйвером устройства», сгенерировать немного сложнее, поскольку для управления им требуется аппаратное обеспечение, а описание аппаратного обеспечения, как правило, сложное.

Однако, используя QEMU или другие эмуляторы, мы можем создавать программные модели реального или упрощенного оборудования, что является отличным способом научиться общаться с оборудованием. Вот простой пример минимального драйвера устройства PCI: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c

Затем мы видим, что в x86, общение с оборудованием сводится к:

Эти операции, как правило, не могут выполняться из пространства пользователя , как объяснено в: В чем разница между пространством пользователя и пространством ядра? Однако есть некоторые исключения: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in- пространство пользователя.

Затем ядро ​​предлагает API более высокого уровня, чтобы сделать такое взаимодействие с оборудованием более простым и переносимым:

  • request_irqдля обработки прерываний
  • ioreadXи сопоставление памяти ввода-вывода
  • еще более высокоуровневые интерфейсы для популярных такие протоколы, как PCI и USB
8
27.01.2020, 19:31

Теги

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