内核arch_initcall的实现及如何自定义initcall

本文详细介绍了Linux内核从3.4到4.2版本中arch_initcall的实现机制,包括如何利用arch_initcall宏在内核初始化后自动执行特定函数,以及如何自定义initcall。通过定义宏、修改链接脚本和更新内核启动流程,实现自定义initcall在内核初始化阶段的执行。
摘要由CSDN通过智能技术生成

内核版本号:3.4~4.2

内核arch_initcall的实现

内核有种函数的标示方法,比如:arch_initcall(VSBOARD_XXXX),可以在内核初始化后自动运行VSBOARD_XXXX函数,以此来达到内核模块可裁剪的目的。

他的具体实现原理:

1、使用arch_initcall宏,会在生成的目标ELF文件增加一个名为".initcall"level".init"的section,并将函数指针放置于该section中。

如果多次调用arch_initcall,将会有多个函数指针放置于该section(他的巧妙之处就利用编译器这点)。

2、vmlinux.lds.S(include"vmlinux.lds.h"),会通过INIT_CALLS宏,将.initcallxxx.init系列section重排,并且通过宏,将函数指针变量__initcall0_start指向这些section的位置。

3、在start_kernel的最后阶段,调用该函数指针__initcall0_start:

start_kernel->reset_init->kernel_init->do_basic_setup->

do_initcalls

如何自定义initcall

比如自定义vsboard_initcall宏,并且希望他在内核初始化之初就能自动运行:

1、定义宏:

#definevsboard_initcall(fn)\

    static initcall

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值