Linux内核中的xx_initcall初始化标号


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

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

  1. #define pure_initcall(fn)               __define_initcall("0",fn,0)   
  2. #define core_initcall(fn)               __define_initcall("1",fn,1)   
  3. #define core_initcall_sync(fn)          __define_initcall("1s",fn,1s)   
  4. #define postcore_initcall(fn)           __define_initcall("2",fn,2)   
  5. #define postcore_initcall_sync(fn)      __define_initcall("2s",fn,2s)   
  6. #define arch_initcall(fn)               __define_initcall("3",fn,3)   
  7. #define arch_initcall_sync(fn)          __define_initcall("3s",fn,3s)   
  8. #define subsys_initcall(fn)             __define_initcall("4",fn,4)   
  9. #define subsys_initcall_sync(fn)        __define_initcall("4s",fn,4s)   
  10. #define fs_initcall(fn)                 __define_initcall("5",fn,5)   
  11. #define fs_initcall_sync(fn)            __define_initcall("5s",fn,5s)   
  12. #define rootfs_initcall(fn)             __define_initcall("rootfs",fn,rootfs)   
  13. #define device_initcall(fn)             __define_initcall("6",fn,6)   
  14. #define device_initcall_sync(fn)        __define_initcall("6s",fn,6s)   
  15. #define late_initcall(fn)               __define_initcall("7",fn,7)   
  16. #define late_initcall_sync(fn)          __define_initcall("7s",fn,7s)  

__define_initcall

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

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

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

  1. typedef int (*initcall_t)(void);  

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

所以__define_initcall的含义是:

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

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

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

  • 1
  • 2
  • 下一页

相关内容