分两步讲述这个问题,第一个步是注册,也是编译过程起的作用,大家熟知内核驱动的c文件中都有module_init函数。module_init函数的功能就是将初始化函数的指针固定在一个段内。第二步就是运行这些初始化函数。硬件开机上电的时候,会去这个固定的段内取函数指针,就可以加载驱动初始化函数了。同理,还有其他的初始化函数也是这样,驱动初始化函数只是其中之一。 下面这些就是用这种方式实现的初始化函数的加载的宏定义。驱动(device_initcall(fn))只是其中的一个。
`#define pure_initcall(fn) __define_initcall(fn, 0)
#define core_initcall(fn) __define_initcall(fn, 1)
#define core_initcall_sync(fn) __define_initcall(fn, 1s)
#define postcore_initcall(fn) __define_initcall(fn, 2)
#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
#define arch_initcall(fn) __define_initcall(fn, 3)
#define arch_initcall_sync(fn) __define_initcall(fn, 3s)
#define subsys_initcall(fn) __define_initcall(fn, 4)
#define subsys_initcall_sync(fn) __define_initcall(fn, 4s)
#define fs_initcall(fn) __define_initcall(fn, 5)
#define fs_initcall_sync(fn) __define_initcall(fn, 5s)
#define rootfs_initcall(fn) __define_initcall(fn, rootfs)
#define device_initcall(fn) __define_initcall(fn, 6)
#define device_initcall_sync(fn) __define_initcall(fn, 6s)
#define late_initcall(fn) __define_initcall(fn, 7)
#define late_initcall_sync(fn) __define_initcall(fn, 7s)`
下图是第一步的过程。
下图是第二步的过程