这个方法是摸索出来的,也不一定对:
1、驱动层module_init(module_init_function)作为模块初始化,并且提供模块内部初始化的函数名;
2、找到所有驱动目录drivers下所有module_init(module_init_function),在内核6.9.0版本实际上找到1979个:module_init_all_in_drivers_path.txt · r77683962/linux-6.9.0 - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0/blob/master/module_init_all_in_drivers_path.txt
命令行:
find drivers -name "*.c" | xargs -i grep -Hrn "^module_init(" {} > module_inits.txt
3、从找到的模块函数中添加打印信息;
4、重新编译代码,重启系统,然后可以看到操作系统在驱动初始化时对哪些模块进行了初始化:
这是完整启动dmesg完整日志:
test_log/dmesg_modules_init.txt · r77683962/linux-6.9.0-testlog - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0-testlog/blob/c31fe277671c2270aa3b77d07b1727f593850ab7/test_log/dmesg_modules_init.txt内核最上层看到的是系统调用入口,最底层是驱动。
方法也是摸索出来的,不一定对。