Linux驱动-late_initcall

一 init的初始化内存分布

vmlinux.lds文件用来决定初始化所用的内存分布
内存的分布可以用下图来说明:
在这里插入图片描述
__init用来标示的是初始化函数,在初始化后不会再调用
__initdata是初始化数据
__initparam是初始化参数,其他7个初始化宏就是初始化函数会用到的。
所有标示为__init的函数都会在链接的时候都会放在.init.text中,放的顺序是不确定的与编译、链接顺序有关。
同时所有__init函数都会在.initcallx.init中放一个函数指针,初始化的时候照.initcall1.init->.initcall7.init的顺序初始化,.initcallx.init有不同的别名,在init.h中定义

二 late_initcall的定义

在这里插入图片描述
在include\linux\init.h 可以看到 late_initcall 的定义,是放在了 .initcall7.init中,即第7段。
而常言的 module_init 是定义为了 device_initcall,即放在了第6个段中。
__define_initcall 在这里就不展开了,详情可以看:

https://blog.csdn.net/weixin_47491758/article/details/131139872?spm=1001.2014.3001.5501

三 late_initcall 和 module_init 的区别

前面有提到,module_init 的放在于第6个段执行,
而 late_initcall 是放在第7个段执行,
所以 late_initcall 的优先级最低,是最后执行的。
这里就涉及到了设备之间的依赖关系。

个人认为,使用 late_initcall 可以保证具有依赖关系的设备,可以先等依赖设备先加载好,再去加载该设备。
例如B设备的加载要依赖A设备,可以让A设备用 module_init加载,B设备使用late_initcall 加载。

四 参考

https://blog.csdn.net/Ivan804638781/article/details/88419376
https://blog.csdn.net/qq_39491794/article/details/80412630

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值