如何为内核中的模块定义依赖关系
示例:
got module1 and module2.
我怎么说在module2
或module1
依赖module2
之后应该加载内核module1
?
注意:module2没有使用module1中的任何符号,但在我的用例中,命令仍然很重要。所以不要与内核中的moddep有关。
答案 0 :(得分:4)
从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).
答案 1 :(得分:2)
为了便于解决,您可以在第一个模块中添加符号,并在第二个模块init中检查该符号。如果未使用
导出符号EXPORT_SYMBOL
你可以从第二个模块init本身返回。
答案 2 :(得分:2)
从linux 4.4内核(可能更早)开始,可以使用软依赖项来指定在请求加载模块之前或之后加载内核模块。可以在modprobe.d(5)联机帮助页中描述的配置文件中设置这些软依赖关系,也可以直接使用MODULE_SOFTDEP
宏在内核模块的代码中直接指定这些依赖项。
要通过修改module2
的代码来完成在module1
之后加载module2
,请在函数外的以下行添加到module2
代码中:
MODULE_SOFTDEP("pre: module1")
要通过修改module1
代码来实现相同目的,请使用以下行:
MODULE_SOFTDEP("post: module2")