initcall初始化标号

LINUX内核中有很多的初始化指示标志postcore_initcall(), arch_initcall(), subsys_initcall(), device_initcall(), etc. 这些起什么作用呢?查阅源代码(Android goldfish-2.6.29)并搜索网上相关文章,对此做一总结。 初始化标号

先看这些宏的定义(定义在文件include/linux/init.h中)

#define pure_initcall(fn)               __define_initcall("0",fn,0)    #define core_initcall(fn)               __define_initcall("1",fn,1)    #define core_initcall_sync(fn)          __define_initcall("1s",fn,1s)    #define postcore_initcall(fn)           __define_initcall("2",fn,2)    #define postcore_initcall_sync(fn)      __define_initcall("2s",fn,2s)    #define arch_initcall(fn)               __define_initcall("3",fn,3)    #define arch_initcall_sync(fn)          __define_initcall("3s",fn,3s)    #define subsys_initcall(fn)             __define_initcall("4",fn,4)    #define subsys_initcall_sync(fn)        __define_initcall("4s",fn,4s)    #define fs_initcall(fn)                 __define_initcall("5",fn,5)    #define fs_initcall_sync(fn)            __define_initcall("5s",fn,5s)    #define rootfs_initcall(fn)             __define_initcall("rootfs",fn,rootfs)    #define device_initcall(fn)             __define_initcall("6",fn,6)    #define device_initcall_sync(fn)        __define_initcall("6s",fn,6s)    #define late_initcall(fn)               __define_initcall("7",fn,7)    #define late_initcall_sync(fn)          __define_initcall("7s",fn,7s)  

__define_initcall

这些宏都用到了__define_initcall(),再看看它的定义(同样定义在文件include/linux/init.h中)

#define __define_initcall(level,fn,id) \            static initcall_t __initcall_##fn##id __used \           __attribute__((__section__(".initcall" level ".init"))) = fn  

这其中initcall_t是函数指针,原型如下,

typedef int (*initcall_t)(void);  

而属性 __attribute__((__section__())) 则表示把对象放在一个这个由括号中的名称所指代的section中。

所以__define_initcall的含义是:

1) 声明一个名称为__initcall_##fn的函数指针;

2) 将这个函数指针初始化为fn;

3) 编译的时候需要把这个函数指针变量放置到名称为 ".initcall" level ".init"的section中。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzdwg.html