linux学习笔记3 初始化的一些补充

本文解析了Linux内核模块的初始化过程,包括静态模块与动态模块的不同初始化时机,以及如何通过insmod工具加载动态模块。同时介绍了init进程加载模块的具体步骤。

在kernel_init里会调用
do_basic_setup();按照level依次调用moduleinit()声明过的模块初始化函数来初始化编译进内核的模块
在随后的init_post()里会起init进程,会加载各个动态模块,同样也是module_init()声明的函数
动态模块的makefile是 obj-m:*.0
静态是 obj-y:*.0
在menuconfig里也可以看到,打M和Y的。

那么,为什么不是在basic_setup里调用呢?


insmod这个工具其实是调用了sys_init_moudle()来给动态模块分配内存空间,并装载模块的符号表到内核符号表,调用初始化函数初始化模块。
也就是说在insmod之前,内核符号表里是没有动态模块的符号表的,因此在basic_setup时,没有找到对应地址的初始化函数,所以没有初始化。



init进程的主函数在/system/code/init/init.c
依次加载了   init.rc  init.*.rc init.*.3rdparty.rc 
init_parse_config_file("/init.rc");

然后触发 init和boot,
 action_for_each_trigger("init", action_add_queue_tail);
    action_for_each_trigger("boot", action_add_queue_tail);
在*.rc文件里我们可以看到:
on boot
    insmod /system/sps/PIXCIR/ko/pixcir_i2c_ts.ko
当有上述调用的时候(boot),就会触发insmod,就会加载sps目录下对应模块的ko。
这样,动态加载的模块就会被加载到内核中


3rd下的文件夹下,均有一个叫init.3rdparty.rc的文件,在lbuild模块的时候,会被加入总的init.3rdparty.*.rc,并依次被init进程加载。
lbuild模块后会将编译生成的*.ko放到指定的位置,一般大多数都在/system/sps/**/ko/ 。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值