late_initcall()与module_init()

11 篇文章 0 订阅
3 篇文章 0 订阅

late_initcall()与module_init()

2018年05月22日 22:02:05 wang_ivan 阅读数:590

内核初始化的模块(当它们静态链接到内核时)的init例程被包装在一个initcall()宏中,该宏指示应该在启动顺序中运行它们的时间。

请参阅包含文件:include / linux / init.h以获取宏列表及其排序。

这里指定的顺序是:

  • early_initcall
  • pure_initcall
  • core_initcall
  • postcore_initcall
  • arch_initcall
  • subsys_initcall
  • fs_initcall
  • rootfs_initcall
  • device_initcall
  • late_initcall

其中大多数有一个“initcall_sync()阶段,用于等待该阶段中所有模块初始化例程的完成。宏用于为每个阶段构建一个函数指针表,这些函数指针按顺序调用 do_initcalls()

如果使用“module_init()”来封装初始化函数,则默认情况下,initcall()将该调用置于初始化的“设备”阶段。在这个阶段,这些项目按链接顺序排列。这意味着该表由链接器遇到的函数顺序创建。

您可以通过更改哪个initcall宏包装模块初始化函数来将初始化移至较早的阶段,但要小心,因为各个模块之间存在顺序依赖关系。改变初始化顺序(在一个阶段中)的另一种方法是调整内核中模块的链接顺序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值