Как модули попадают в ядро?
Вы можете просмотреть список загруженных модулей командой lsmod, которая в свою очередь обращается за необходимыми сведениями к файлу /proc/modules.
Как же модули загружаются ядром? Когда ядро обнаруживает необходимость в тех или иных функциональных возможностях, еще не загруженных в память, то демон kmod [1]
вызывает утилиту modprobe, передавая ей строку в виде:
Название модуля, например softdog или ppp.
Универсальный идентификатор, например char-major-10-30.
Если утилите modprobe
передается универсальный идентификатор, то она сначала пытается отыскать имя соответствующего модуля в файле /etc/modules.conf, где каждому универсальному идентификатору поставлено в соответствие имя модуля, например:
alias char-major-10-30 softdog
Это соответствует утверждению: "Данному универсальному идентификатору соответствует файл модуля softdog.ko".
Затем modprobe отыскивает файл /lib/modules/version/modules.dep, чтобы проверить -- не нужно ли загружать еще какие-либо модули, от которых может зависеть заданный модуль. Этот файл создается командой depmod -a и описывает зависимости модулей. Например, модуль msdos.ko требует, чтобы предварительно был загружен модуль fat.ko. Если модуль Б экспортирует ряд имен (имена функций, переменных и т.п.), которые используются модулем А, то говорят, что "Модуль А зависит от модуля Б".
И наконец modprobe вызывает insmod, чтобы сначала загрузить необходимые, для удовлетворения зависимостей, модули, а затем и запрошенный модуль. Вызывая insmod, утилита modprobe указывает ей каталог, /lib/modules/version/ [2] -- стандартный путь к модулям ядра. Утилита insmod ничего не "знает" о размещении модулей ядра, зато это "знает" утилита modprobe. Таким образом, если вам необходимо загрузить модуль msdos, то вам необходимо дать следующие команды:
insmod /lib/modules/2.6.0/kernel/fs/fat/fat.ko insmod /lib/modules/2.6.0/kernel/fs/msdos/msdos.ko
или просто:
modprobe -a msdos
В большинстве дистрибутивов Linux, утилиты modprobe, insmod, depmod входят в состав пакета modutils или mod-utils.
Прежде чем закончить эту главу, я предлагаю вкратце ознакомиться с содержимым файла /etc/modules.conf:
### This file is automatically generated by modules-update # # Please do not edit this file directly. If you want to change or add # anything please take a look at the files in /etc/modules.d and read # the manpage for modules-update. # ### modules-update: start processing /etc/modules.d/aliases # Aliases to tell insmod/modprobe which modules to use path[misc]=/lib/modules/2.6.?/local keep path[net]=~p/mymodules options mydriver irq=10 alias eth0 eepro
Строки, начинающиеся с символа "#" являются комментариями. Пустые строки игнорируются.
Строка path[misc] сообщает modprobe о том, что модули ядра из категории misc следует искать в каталоге /lib/modules/2.6.?/local. Как видите, здесь вполне допустимы шаблонные символы.
Строка path[net] задает каталог размещения модулей категории net, однако, директива keep, стоящая выше, сообщает, что каталог ~p/mymodules не замещает стандартный путь поиска модулей (как это происходит в случае с path[misc]), а лишь добавляется к нему.
Строка alias говорит о том, что если запрошена загрузка модуля по универсальному идентификатору eth0, то следует загружать модуль eepro.ko
Вы едва ли встретите в этом файле строки, подобные:
alias block-major-2 floppy
поскольку modprobe уже знает о существовании стандартных драйверов устройств, которые используются в большинстве систем.