Когда ядро обнаруживает новое устройство, оно запускает программу modprobe
и передает ему имя, которое идентифицирует устройство. Большинство устройств идентифицируются по зарегистрированным номерам для поставщика и модели, например, идентификаторы PCI или USB . modprobe
Программа обращается к таблице модуля псевдонима , чтобы найти имя файла , который содержит драйвер для данного устройства. Аналогичный принцип применяется к драйверам для вещей, которые не являются аппаратными устройствами, такими как файловые системы и криптографические алгоритмы. Для получения дополнительной информации см. Debian не обнаруживает последовательную карту PCI после перезагрузки./lib/modules/VERSION/modules.alias
Как только modprobe определит, какой модуль file ( .ko
) содержит запрошенный драйвер, он загружает файл модуля в ядро: код модуля динамически загружается в ядро. Если модуль загружен успешно, он появится в списке из lsmod
.
Автоматическая загрузка модулей происходит, когда ядро обнаруживает новое горячее подключаемое оборудование, например, когда вы подключаете периферийное устройство USB. Операционная система также выполняет перечисление всего оборудования, которое присутствует в системе на ранних этапах запуска, чтобы загрузить драйверы для периферийных устройств, которые присутствуют во время загрузки.
Также можно вручную запросить загрузку модуля с помощью команды modprobe
или insmod
. Большинство дистрибутивов содержат скрипт запуска, который загружает модули, перечисленные в /etc/modules
. Другой способ загрузки модулей - это если они зависят от модуля: если модуль A зависит от модуля B, то modprobe A
загружает B перед загрузкой A.
После загрузки модуля он остается загруженным до тех пор, пока не будет явно выгружен, даже если все устройства, использующие этот драйвер, были отключены. Давным-давно существовал механизм автоматической выгрузки неиспользуемых модулей, но он был удален, если я правильно помню, когда на сцену вышел udev. Я подозреваю, что автоматическая выгрузка модулей не является обычной функцией, потому что системы, которые, как правило, нуждаются в этом, в основном являются настольными ПК с большим количеством памяти в любом случае (в масштабе кода драйвера).
/etc/modules
.rt2800usb
находится в выводеlsmod
, и означает ли это, что я подключил его устройство к компьютеру до загрузки?/etc/modules
, то да, вероятно, причина загрузки модуля заключается в том, что устройство присутствовало в какой-то момент.Модули загружаются при загрузке системы через начальный RAM-диск, называемый initrd . Раздел обоснования утверждает:
Ubuntu, как и многие другие дистрибутивы, выбирает загрузку каждого драйвера устройства в этот initrd, независимо от того, нужен драйвер или нет, а также независимо от того, присутствует ли устройство в системе или нет. Как указал Джайлс, все это загружается в ОЗУ, а затем при запуске обнаруживаются используемые модули, а неиспользуемые модули удаляются из ОЗУ. Использование этого подхода гарантирует, что Ubuntu всегда будет запускаться в любой системе независимо от настроек. Ubuntu имитирует монолитное ядро, используя микроядерные конструкции. Посмотрите причину это работает
rt2800usb
всегда будет загружаться при загрузке, потому что модуль был включен в initramfs, на который ссылался Жиль. Initramfs является преемником initrd, поэтому он всегда будет показан какlsmod
. Обратите внимание, что вы можете вставить вновь скомпилированный модуль в ядро, используяmodprobe
имя модуля.В качестве теста перезагрузите систему с отключенным беспроводным адаптером. Если все идет хорошо, модуль не будет указан в
lsmod
выводе s, потому что во время загрузки процесс обнаружения, запущенный initramfs и системой init, не обнаружил устройство во время исследования, и модуль был удален из ОЗУ.rmmod
илиmodprobe -r
после имени модуля. При следующей загрузке модуль будет перезагружен. Смотрите выше. В большинстве случаев модуль не удаляется динамически, так как это отключило бы горячее подключение, т. Е. После удаления модуля устройство, использующее его, не может быть снова обнаружено при повторном подключении.Чтобы удалить модуль из
lsmod
, вы должны удалить его из образа initramfs, созданного путем перекомпиляции ядра без выбранного модуля и последующей перестройки образа. Это отключает все обнаружение указанного модуля.источник
/sys
и загрузки драйверов для устройств, которые фактически находятся в системе. Это происходит независимо от того, присутствует ли устройство при загрузке или подключено позже.udev
имеет гораздо больше общего с этим, чем initramfs / initrd, и то, будут ли все, большинство или только некоторые модули скопированы в initramfs (опция конфигурации в/etc/initramfs-tools/initramfs.conf
), не имеет особого значения.