Как определить зависимость между модулями ядра?


Как можно определить зависимость для модулей в ядре,

Пример:

got module1 and module2.

Как сказать, что ядро module2 должно быть загружено после module1 или module2 зависит от module1?

Примечание: module2 не использует какой-либо символ из module1, но все же порядок важен в моем случае использования. так что не связывайтесь с moddep в ядре.

3 2

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")