Skip to content

Linux – module_init

Linux 利用了程序编译链接的一个技巧,在GCC里可以通过 __attribute__ 将指定代码放入到某个特定的段(section)中,内核模块就是这样被统一管理起来的。如图中所示,指向模块初始化代码的函数指针都被放置在一个 “.initcall6.init” 的代码段里,而模块初始化代码则放置在另一个代码段 “.init.text”。这样的好处就是内核启动时加载内建(built-in)内核模块阶段可以很方便地根据首指针依次将所有模块遍历出来,这有点像 Unix 哲学中将代码复杂度转移到数据上去寻求简洁,事实证明这样干确实简洁漂亮。

结合代码看图:Fig 1. snapshot of *_module_init in kernel image

drivers/usb/serial/cp210x.c
include/usb/serial.h
   module_usb_serial_driver(serial_drivers, id_table)
init/main.c
include/asm-generic/vmlinux.lds.h
   do_initcalls
     initcall_levels
include/linux/module.h
include/linux/init.h
   module_init(x)
     __initcall(fn)
外部链接:

Post a Comment

Your email is never published nor shared. Required fields are marked *