Ядро Linux и модули

Модули

Последнее обновление: 21.03.2024

Ядро Linux является сердцем операционной системы. Это программное обеспечение, которое напрямую взаимодействует с оборудованием. Ядро — единственная часть операционной системы, которая напрямую взаимодействует с оборудованием; все остальные компоненты, которые вы используете, должны пройти через ядро. Для доступа к различным аппаратным компонентам ядру необходимы драйверы. Роль драйвера — сообщить ядру, как именно оно должно обращаться к оборудованию. Каждый драйвер ядра представлен модулем ядра. Только самые необходимые драйверы компилируются непосредственно в самом ядре. Остальные - менее важные драйверы подгружаются ядром

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

Для получения списка всех загруженных модулей применяется команда lsmod:

eugene@Eugene:~$ lsmod
Module                  Size  Used by
ntfs3                 344064  1
esp4                   28672  0
xfrm_interface         28672  0
xfrm6_tunnel           16384  1 xfrm_interface
..............................................
nvme_common            28672  1 nvme_core
vmd                    24576  0
ucsi_acpi              12288  0
typec_ucsi             53248  1 ucsi_acpi
typec                 110592  1 typec_ucsi
video                  73728  3 asus_wmi,i915,nouveau
wmi                    40960  6 video,asus_wmi,wmi_bmof,mfd_aaeon,mxm_wmi,nouveau
eugene@Eugene:~$ 

Вывод команды lsmod показывает не только какие модули загружены, но и что они делают. Вывод представляет таблицу из трех столбцов:

  • Имя модуля

  • Объем используемой модулем памяти

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

Также можно найти определенные модули. Например, найдем модуль "bluetooth":

eugene@Eugene:~$ lsmod | grep bluetooth
bluetooth            1077248  34 btrtl,btmtk,btintel,btbcm,bnep,btusb,rfcomm
ecdh_generic           16384  1 bluetooth
eugene@Eugene:~$ 

Просмотр информации о модулях и modinfo

Для получения информации о модуле, который в данный момент загружен, выполняется команда modinfo:

modinfo [options] modulename

Эта команда принимает имя модуля, о котором надо вывести информацию, и также может принимать необязательные опции:

  • -a, --author: выводит только автора модуля

  • -d, --description: выводит только описание

  • -l, --license: выводит только лицензию

  • -p, --parameters: выводит только параметры

  • -n, --filename: выводит только имя файла

  • -F, --field=FIELD: выводит только указанное поле FIELD

  • -V, --version: выводит только версию

Если опции явным образом не указывают, какую информацию надо вывести, то выводится вся информация о модуле. Например, выведем инфу о модуле "bluetooth":

eugene@Eugene:~$ modinfo bluetooth
filename:       /lib/modules/6.5.0-26-generic/kernel/net/bluetooth/bluetooth.ko.zst
alias:          net-pf-31
license:        GPL
version:        2.22
description:    Bluetooth Core ver 2.22
author:         Marcel Holtmann <marcel@holtmann.org>
srcversion:     C91504123EB8C35EA0398EF
depends:        ecdh_generic
retpoline:      Y
intree:         Y
name:           bluetooth
vermagic:       6.5.0-26-generic SMP preempt mod_unload modversions 
sig_id:         PKCS#7
signer:         Build time autogenerated kernel key
sig_key:        EA:9B:71:2C:1A:62:D5:9E::D1:D8:43:A4:01:07:A6:D0:DDA8:50:6A
sig_hashalgo:   sha512
signature:      1B:8A:2C:E2:F3:DE:96:1B:AB:3B:78:B4:AD:0E
parm:           disable_esco:Disable eSCO connection creation (bool)
parm:           disable_ertm:Disable enhanced retransmission mode (bool)
parm:           enable_ecred:Enable enhanced credit flow control mode (bool)
eugene@Eugene:~$ 

Загрузка и выгрузка модулей

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

Чтобы выгрузить загруженный в данный момент модуль, используется команда modprobe -r. Например, следующая команда выгрузит модуль bluetooth:

modprobe -r bluetooth

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

eugene@Eugene:~$ modprobe -r bluetooth
modprobe: FATAL: Module bluetooth is in use.
eugene@Eugene:~$ 

Для загрузки модуля его имя просто передается команде modprobe:

modprobe bluetooth

Загрузка модуля может завершиться неудачей из-за ошибок версии. Обычно модули пишутся для конкретной версии ядра, и если версия в модуле неправильная, он не сможет загрузиться.

Поиск правильного модуля

Обычно нужные модули для аппаратного обеспечения компьютера загружаются автоматически. Это можно проверить с помощью команды lspci -k. Например:

eugene@Eugene:~$ lspci -k
00:00.0 Host bridge: Intel Corporation 16th Gen Core Processor Host Bridge/DRAM Registers (rev 08)
	DeviceName: Onboard - Other
	Subsystem: ASUSTeK Computer Inc. 16th Gen Core Processor Host Bridge/DRAM Registers
00:01.0 PCI bridge: Intel Corporation 16th Gen Core Processor PCI Express x16 Controller #1 (rev 08)
	Subsystem: ASUSTeK Computer Inc. 16th Gen Core Processor PCI Express x16 Controller
	Kernel driver in use: pcieport
00:02.0 VGA compatible controller: Intel Corporation SuperLake-S GT1 (rev 0c)
	DeviceName: Onboard - Video
	Subsystem: ASUSTeK Computer Inc. SuperLake-S GT1
	Kernel driver in use: i919
	Kernel modules: i919
00:06.0 Network controller: Intel Corporation Wi-Fi 6 AX210/AX211/AX411 160MHz (rev 1a)
	Subsystem: Intel Corporation Wi-Fi 6 AX210 160MHz
	Kernel driver in use: iwlwifi
	Kernel modules: iwlwifi
...........................

Здесь можно увидеть применяемые драйвер и модуль для определенной подсистемы компьютера. В некоторых случаях может не отображаться ни одного драйвера ядра. В этом случае модуль ядра для этого конкретного оборудования не найден. Для решения этой проблемы следует поискать проприетарный драйвер у поставщика конкретного оборудования.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850