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

在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/ 。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值