1. 先看这些宏的定义(定义在文件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)

initcall

2. __define_initcall

/* 初始化调用函数依据功能分组成独立的子段,这些字段的内部排列顺序由链接顺序决定 */

/* 为了向后的兼容性,initcall()放置这些函数在器件的初始化字段 */

/* __define_initcall 中 id 这个参数是必要的,这样多个initcalls可以同时指向同一个handler */

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

__define_initcall

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

 typedef int (*initcall_t)(void);

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

所以__define_initcall的含义是:

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

2) 将这个函数指针指向传入的函数名fn;

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

最新文章

  1. 解读ASP.NET 5 & MVC6系列
  2. CSS3学习笔记
  3. 冲突--ListView与ScrollView冲突的4种解决方案
  4. OpenCV之mixChannels()函数使用说明
  5. pop3
  6. export和import实现模块化
  7. HLG 2163 方格取数 (最大网络流)
  8. sql server 2008 数据库管理系统使用SQL语句创建登录用户详细步骤
  9. Vue安装依赖npm install时报错问题解决方法
  10. python/Djangof分页与自定义分页
  11. 剑指Offer编程题2——替换空格
  12. [LeetCode] Binary Trees With Factors 带因子的二叉树
  13. webService-cxf框架的使用
  14. Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
  15. Find a way
  16. Volume is already attached by pod default/nginx-deployment-86dfb99868-szpkd. Status Running
  17. 10 月 30 日新款 Mac mini 有望与新款 iPad Pro 一起发布
  18. PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)
  19. Android 编程下 Eclipse 恢复被删除的文件
  20. 同时启动多个Tomcat服务器

热门文章

  1. Unity3d Terrain splat 9 is null 解决方法
  2. SNIPER-MXNet中出现ValueError: could not broadcast input array from shape (XXX,5) into shape (100,5)
  3. python遍历文件夹中所有文件夹和文件,os.walk
  4. 如何做一个项目v2.ppt
  5. AssassinGo: 基于Go的高并发可拓展式Web渗透框架
  6. How To Use Rocketbots As A Dialogflow CRM
  7. Linux 基本权限管理
  8. 学习Yii(3)
  9. 阿里云Centos 7.6安装Redis以及开启远程连接
  10. solr后台操作Documents之增删改查