Как определить зависимость между модулями ядра?
Как можно определить зависимость для модулей в ядре,
Пример:
got module1 and module2.
Как сказать, что ядро module2
должно быть загружено после module1
или module2
зависит от module1
?
Примечание: module2 не использует какой-либо символ из module1, но все же порядок важен в моем случае использования. так что не связывайтесь с moddep в ядре.
3 ответа:
Для упрощения решения вы можете добавить символ в первый модуль и проверить этот символ во втором модуле init. Если символ не экспортируется с помощью
EXPORT_SYMBOL
Вы можете вернуться из самого второго модуля init.
Цитата из man-страницы depmod:
Linux kernel modules can provide services (called "symbols") for other modules to use (using one of the EXPORT_SYMBOL variants in the code). If a second module uses this symbol, that second module clearly depends on the first module. These dependencies can get quite complex. depmod creates a list of module dependencies by reading each module under /lib/modules/version and determining what symbols it exports and what symbols it needs. By default, this list is written to modules.dep, and a binary hashed version named modules.dep.bin, in the same directory. If filenames are given on the command line, only those modules are examined (which is rarely useful unless all modules are listed). depmod also creates a list of symbols provided by modules in the file named modules.symbols and its binary hashed version, modules.symbols.bin. Finally, depmod will output a file named modules.devname if modules supply special device names (devname) that should be populated in /dev on boot (by a utility such as udev).
Начиная с ядра linux 4.4 (и, возможно, более ранних версий) мягкие зависимости могут использоваться для указания того, что модуль ядра должен быть загружен до или после запроса на загрузку модуля. Эти мягкие зависимости можно настроить в конфигурационном файле, как описано в modprobe.D (5) manpage, или они могут быть указаны непосредственно в коде для модуля ядра непосредственно с помощью макроса
MODULE_SOFTDEP
.Чтобы выполнить загрузку
module2
послеmodule1
путем изменения кодаmodule2
, добавьте эту строку за пределами a функция для кодаmodule2
:
MODULE_SOFTDEP("pre: module1")
Чтобы выполнить то же самое, изменив код
module1
, вы бы использовали следующую строку:
MODULE_SOFTDEP("post: module2")