__init利用了 GCC 的特性 attribute((section(".init.text")))。这意味着编译器在生成二进制文件时,不会把这个函数放在常规的 .text 代码段,而是专门开辟了一个名为 .init.text 的特殊段。
Linux 内核启动或加载模块时,执行流程如下:
加载:内核将所有标注为 __init 的函数加载到内存的特定区域。
执行:调用这些初始化函数(如 module_init 指定的函数)。
释放:一旦初始化完成,内核会调用 free_initmem()。
内核会遍历 .init.text 所在的内存页。
释放这些内存页,将其重新标记为可用状态。