问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

【Linux内核|驱动模型】initcall和module_init

发布网友 发布时间:2024-10-03 22:09

我来回答

1个回答

热心网友 时间:2024-10-18 17:04

内核版本:Linux-6.1

文章目录汇总:所有文章目录 - 知乎 (zhihu.com)

模块初始化的宏观:module_init

在Linux内核开发和驱动开发中,module_init 是一个常见的宏,定义在 include/linux/module.h 文件中。它的实现会根据是否定义了 MODULE 宏有所不同,这决定了驱动是与内核编译到一起,还是单独编译为.ko文件。

MODULE 的定义通常通过编译时的参数传递,可通过查看 Makefile 文件,如在编译.ko时使用特定的编译选项,而链接到内核时则不会使用这些选项。

未使能 MODULE 情况下,module_init 实际上是作为特殊 initcall,用于声明初始化函数并控制函数调用顺序。initcall 有多个级别,module_init 实际对应于 device_initcall,级别为 6。initcall 会在编译时声明一个 initcall_t 类型的静态变量,并放入内核的 .init.data 段。

initcall 的实现和行为可以通过查看 arch64-linux-gnu-nm -n vmlinux 命令的输出进行分析。以 __initcall__kmod_cpuinfo__334_359_cpuinfo_regs_init6 为例,这个 initcall_t 类型的静态变量的名称和行为可从 __initcall_name 和 __initcall_id 的输出得出。

rootfs_initcall 在 5 秒后被调用,它在 do_basic_setup 中执行,需要在此之前将存储介质准备好,如读取文件系统镜像。

console_initcall 用于尽早输出日志,其初始化函数在 console_init 中调用,而 console_init 尽量选择较早时机进行。

链接脚本中,initcall 声明的变量放入以 .initcall 开头的段中,每个级别对应一个段,并按顺序放入 .init.data 段。

initcall 的执行时机包括 do_pre_smp_initcalls 和 do_basic_setup,前者在多核处理器和调度系统初始化之前执行,后者按 initcall 级别依次执行指定函数。链接时和多次编译的顺序可能影响同级别 initcall 的执行顺序。

当 MODULE 使能时,Linux 中的某些模块可选择链接到内核或编译为.ko文件。initcall 宏被定义为 module_init 以兼容两者。分析 module_init 实现,可以参考《module_init 源码》。

__inittest:代码中未找到调用地方,但从 v2.6.0 对 module_init 的注释推测,可能是为了防止编译器警告。

init_module 是 initfn 的别名,具有相同的地址,通常为静态函数,而 init_module 为全局函数。在命令行使用 insmod 或 modprobe 安装模块时,系统最终调用 init_module 或 finit_module。

init_module 和 finit_module 用于从用户态加载.ko文件,查看 man 2 init_module 可以了解这两个函数的具体使用。

加载模块的流程最终会调用 load_module,其流程如下。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机系统怎么更新(手机系统怎么更新到最新版本) 手机操作系统怎么升级最新版本呢 ...一下有没有那种模仿声音的东西,自己给老班打电话时发出的时成年人声... ...经纬线的说法,正确的是( )A.纬线是与地轴垂直并环绕地球的半圆B... 下列有关纬线的说法,正确的是( )A.所有纬线长度都相等B.纬线都是半 ... 下列有关经纬线的说法,错误的是( )A.地球仪上能画无数条经线B.所有纬 ... 关于纬线和纬度的叙述,不正确的是( )A.纬线指示南北方向B.北纬用“N... 纬线的特征中说法错误的是( ) A.所有纬线相互平行 B.纬线等长 C.同一纬... 下列关于纬线的说法,不正确的是( )A.所有纬线都自成圆圈B.纬线长度都... 关于纬线的说法,错误的是( ) A.纬度越高,纬线越短 B.纬线都是圆圈 C... 想问下有谁知道现在的西安比较大的碟市在哪?? 打篮球运球时总是觉得控制不了球,怎么办呀? 请提供西安淘碟的去处 驾照B本有三年没审了,是否已经被注销了,要怎么样才能用回? b2驾驶证忘了提交身体证明了,怎么办 运球时控制不了球 为什么我运球一跑就控制不了球了? 我爸的驾驶证是B2的,已经两年没体检了,会被注销吗?如果会,那有没有... 请问B2以上的驾驶证,三年未提交体检表,会受到怎样相应的处罚。_百度... 梦见男朋友被泥巴淹死的预兆 螃蟹怎么冷冻 螃蟹冷冻保存方法 微波炉好还是烤箱好 如果两样都买 大概要多少钱 心理咨询师报考需要准备什么资料? 奇骏油表开闪以后还能跑多少公里 心理咨询师考证需要什么条件 想做苹果派,没有烤箱可以用微波炉代替么,或者说需要什么类型的烤箱,价 ... 奇骏油表到红线还能跑多远? 树干为什么刷白色 心理咨询师报名资料有哪些要求? ...为什么查找我的iPhone显示的实时位置和实际位置不一样,定位可以手动... 了解西安碟市的朋友请帮忙。。 Linux驱动| Linux内核 RTC时间架构 module_init(linux kernel 宏函数之“模块的起点”) 53年6月出生属什么 西安 买碟 西安原来朝阳门那里有卖碟的,现在拆了,那么那些商贩现在在哪里卖... 古代名人书房对联赏析 平时翻书见有名人书室楹联,便随手抄录,日积月累... 有信网络电话通一半自动挂断 2019年属蛇运程 西安哪有卖碟的 关于电场强度公式E=F/q 不是说E与F和q无关吗 那为什么第二个图的... ...如果改变放入同一位置的电荷大小改变,电场强度会不会改变?_百度知... ...路难走是不是指在手的虎口处纹身会有倒霉和不顺利的事发生呀,谁知道... ...路难走是不是指在手的虎口处纹身会有倒霉和不顺利的事??有知道的吗... ...路难走是不是指在手的虎口处纹身会有倒霉和不顺利的事发生呀?有没... ...路难走是不是指在手的虎口处纹身会有倒霉和不顺利的事发生呀,有没... 广发环球信用卡金卡额度是多少呀? ...路难走是不是指在手的虎口处纹身会有倒霉和不顺利的事发生呀??_百 ... 做回锅肉的那个肉要煮多久 眼袋手术后多久能恢复正常