Fel*_* Du 0 c linux kernel-module linux-kernel
当Linux内核使用insmod加载新模块时,它将调用
finit_module
do_init_module
do_one_initcall
Run Code Online (Sandbox Code Playgroud)
然后将调用模块中定义的 init 函数。
finit_module
do_init_module
do_one_initcall
Run Code Online (Sandbox Code Playgroud)
但是在搜索了linux内核的所有代码后,我没有找到mod->init分配的地方,有人可以帮助我吗?
提前致谢。
mod->init和的值mod->exit来自模块的 .ko 文件部分struct module __this_module中包含的变量。.gnu.linkonce.this_module内核假定该变量位于该节的开头,实际上它是该节中唯一的变量。
该变量由modulename__this_module .mod.c 文件中的 C 初始化程序初始化,该文件是在内核构建过程的 MODPOST 阶段生成的。对于当前内核, modulename .mod.c 文件中变量的典型定义如下所示:__this_module
__visible struct module __this_module
__section(.gnu.linkonce.this_module) = {
.name = KBUILD_MODNAME,
.init = init_module,
#ifdef CONFIG_MODULE_UNLOAD
.exit = cleanup_module,
#endif
.arch = MODULE_ARCH_INIT,
};
Run Code Online (Sandbox Code Playgroud)
和finit_modulesyscallinit_module处理函数调用load_module完成大部分工作。load_module调用setup_load_info,除其他外,它查找.gnu.linkonce.this_module仅包含__this_module变量的部分。指向此的临时指针被放置在info->mod(其中info指向struct load_info用于保存加载模块的信息)。load_module后来调用它在将变量复制到内核内存中的最终位置后layout_and_allocate返回一个指向该变量的指针__this_module(实际上是指向该部分的指针) 。在调用执行动态链接之后,和将会得到它们的最终值(忽略内核 5.13 及以后的修改)。.gnu.linkonce.this_modulemove_moduleload_moduleapply_relocationsmod->initmod->exitCONFIG_CFI_CLANG
请注意,__this_module.init函数指针始终是指向 null 的指针init_module或默认为 null,并且__this_module.exit函数指针始终是指向 null 的指针cleanup_module或默认为 null。(大多数模块源代码使用module_init(initfn)和module_exit(exitfn)宏来创建这些函数,但可以显式定义它们。)