XXX_initcall()函数分析
2024-09-04 03:47:25
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中。
最新文章
- 解读ASP.NET 5 &; MVC6系列
- CSS3学习笔记
- 冲突--ListView与ScrollView冲突的4种解决方案
- OpenCV之mixChannels()函数使用说明
- pop3
- export和import实现模块化
- HLG 2163 方格取数 (最大网络流)
- sql server 2008 数据库管理系统使用SQL语句创建登录用户详细步骤
- Vue安装依赖npm install时报错问题解决方法
- python/Djangof分页与自定义分页
- 剑指Offer编程题2——替换空格
- [LeetCode] Binary Trees With Factors 带因子的二叉树
- webService-cxf框架的使用
- Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
- Find a way
- Volume is already attached by pod default/nginx-deployment-86dfb99868-szpkd. Status Running
- 10 月 30 日新款 Mac mini 有望与新款 iPad Pro 一起发布
- PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)
- Android 编程下 Eclipse 恢复被删除的文件
- 同时启动多个Tomcat服务器
热门文章
- Unity3d Terrain splat 9 is null 解决方法
- SNIPER-MXNet中出现ValueError: could not broadcast input array from shape (XXX,5) into shape (100,5)
- python遍历文件夹中所有文件夹和文件,os.walk
- 如何做一个项目v2.ppt
- AssassinGo: 基于Go的高并发可拓展式Web渗透框架
- How To Use Rocketbots As A Dialogflow CRM
- Linux 基本权限管理
- 学习Yii(3)
- 阿里云Centos 7.6安装Redis以及开启远程连接
- solr后台操作Documents之增删改查