为何部分Linux内核驱动模块无__init函数,与LDD中module_init强制要求矛盾?
问题解答
- 你提到的《Linux Device Drivers》(通常简称LDD3)是基于Linux 2.6内核版本撰写的经典教程,其表述的「module_init使用是强制的」核心逻辑完全成立,Linux内核的模块机制始终要求每个可加载模块必须通过
module_init指定加载入口,内建模块也需要通过该宏指定初始化入口,这个底层逻辑至今没有变化。你看不到显式的调用和__init函数定义,是因为当前内核版本做了大量上层封装简化。 - 你观察到的大量驱动没有显式定义
__init修饰的初始化函数、没有直接调用module_init,核心原因是内核为各类总线驱动提供了封装好的入口宏,自动帮开发者完成了初始化、入口注册的重复逻辑:常见的封装宏包括
module_spi_driver()、module_i2c_driver()、module_platform_driver()、module_pci_driver()等,适配不同总线类型的驱动。这些宏的内部实现已经自动生成了带__init修饰的初始化函数、带__exit修饰的清理函数,并且自动调用了module_init()、module_exit()完成入口注册。 - 以你提到的st95hf NFC驱动为例,它属于SPI总线外设驱动,代码中会调用
module_spi_driver(&st95hf_driver)这类封装宏完成驱动注册,你不需要手动写初始化函数,自然也找不到显式的__init标记和module_init调用。 - 这类封装的核心目的是减少驱动开发者的重复代码量,统一驱动入口逻辑,避免手动注册时的常见错误。如果你的驱动不属于任何标准总线框架、或者有自定义的复杂初始化逻辑,依然需要手动定义
__init函数并通过module_init注册入口,此时LDD3的表述就会直接体现在代码里。
内容的提问来源于stack exchange,提问作者deadParrot
相关产品推荐
相关产品推荐

