initcall机制
参考:initcall机制
/*
include/linux/init.h:
*/
/* For assembly routines */
#define __HEAD .section ".head.text","ax"
#define __INIT .section ".init.text","ax"
#define __CPUINIT .section ".cpuinit.text", "ax" #define __init __section(.init.text) __cold notrace
/*
__initcall_start = .;
*(.initcallearly.init) //#define early_initcall(fn) __define_initcall("early",fn,early)
__early_initcall_end = .;
*(.initcall0.init) //#define pure_initcall(fn) __define_initcall("0",fn,0)
*(.initcall0s.init)
*(.initcall1.init) //#define core_initcall(fn) __define_initcall("1",fn,1)
*(.initcall1s.init) //#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)
*(.initcall2.init) //#define postcore_initcall(fn) __define_initcall("2",fn,2)
*(.initcall2s.init) //#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
*(.initcall3.init) //#define arch_initcall(fn) __define_initcall("3",fn,3)
*(.initcall3s.init) //#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)
*(.initcall4.init) //#define subsys_initcall(fn) __define_initcall("4",fn,4)
*(.initcall4s.init) //#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
*(.initcall5.init) //#define fs_initcall(fn) __define_initcall("5",fn,5)
*(.initcall5s.init) //#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
*(.initcallrootfs.init) //#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
*(.initcall6.init) //#define device_initcall(fn) __define_initcall("6",fn,6)
*(.initcall6s.init) //#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
*(.initcall7.init) //#define late_initcall(fn) __define_initcall("7",fn,7)
*(.initcall7s.init) //#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)
__initcall_end = .; #define module_init(x) __initcall(x);
#define __initcall(fn) device_initcall(fn)
#define device_initcall(fn) __define_initcall("6",fn,6) */
下面以arch_initcall(customize_machine);为例分析宏的展开过程
static int __init customize_machine(void)
{
/* customizes platform devices, or adds new ones */
if (machine_desc->init_machine)
machine_desc->init_machine();
return ;
}
arch_initcall(customize_machine);
typedef int (*initcall_t)(void); //定义函数指针,无参数,返回int
#define arch_initcall(fn) __define_initcall("3",fn,3)
/* initcalls are now grouped by functionality into separate
* subsections. Ordering inside the subsections is determined
* by link order.
* For backwards compatibility, initcall() puts the call in
* the device init subsection.
*
* The `id' arg to __define_initcall() is needed so that multiple initcalls
* can point at the same handler without causing duplicate-symbol build errors.
*/
#define __define_initcall(level,fn,id) \
static initcall_t __initcall_##fn##id __used \
__attribute__((__section__(".initcall" level ".init"))) = fn
arch_initcall(customize_machine)展开为
static initcall_t __initcall_customize_machine3 __used __attribute__((__section__(".initcall3.init"))) = customize_machine
initcall机制的更多相关文章
- linux的initcall机制
linux的initcall机制(针对编译进内核的驱动) initcall机制的由来 我们都知道,linux对驱动程序提供静态编译进内核和动态加载两种方式,当我们试图将一个驱动程序编译进内核时,开发者 ...
- linux initcall机制
Linux系统启动过程很复杂,因为它既需要支持模块静态加载机制也要支持动态加载机制.模块动态加载机制给系统提供了极大的灵活性,驱动程序既可支持静态编译进内核,也可以支持动态加载机制.Linux系统中对 ...
- Linux动态频率调节系统CPUFreq之二:核心(core)架构与API
上一节中,我们大致地讲解了一下CPUFreq在用户空间的sysfs接口和它的几个重要的数据结构,同时也提到,CPUFreq子系统把一些公共的代码逻辑组织在一起,构成了CPUFreq的核心部分,这些公共 ...
- 设备树处理之——device_node转换成platform_device【转】
转自:https://www.cnblogs.com/downey-blog/p/10486568.html 以下讨论基于linux4.14,arm平台 platform device 设备树的产生就 ...
- linux设备驱动程序-设备树(2)-device_node转换成platform_device
设备树处理之--device_node转换成platform_device 以下讨论基于linux4.14,arm平台 platform device 设备树的产生就是为了替代driver中过多的pl ...
- linux内核makefile概览
linux内核makefile概览 本博客参照内核官方英文文档 linux的内核makefile主要用于编译整个内核源码,按照用户的需求生成各种目标文件,对于用户来说,编译内核时非常简单的,只需要几个 ...
- linux设备驱动程序-i2c(1):i2c总线的添加与实现
linux设备驱动程序-i2c(1):i2c总线的添加与实现 (基于4.14内核版本) 在上一章节linux设备驱动程序-i2c(0)-i2c设备驱动源码实现中,我们演示了i2c设备驱动程序的源码实现 ...
- 详解Linux2.6内核中基于platform机制的驱动模型 (经典)
[摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了Platform总线的基本概念,接着介绍了platform device和platform dri ...
- Linux内核启动流程与模块机制
本文旨在简单的介绍一下Linux的启动流程与模块机制: Linux启动的C入口位于/Linux.2.6.22.6/init/main.c::start_kernel() 下图简要的描述了一下内核初始化 ...
随机推荐
- 洛谷P2599||bzoj1413 [ZJOI2009]取石子游戏
bzoj1413 洛谷P2599 根本不会啊... 看题解吧 #include<cstdio> #include<algorithm> #include<cstring& ...
- python入门之装饰器
入门原理: 一系列函数要做相同的修改,在这些函数执行之前做的操作,或者在执行之后做的操作都可以在一个装饰器(函数)里修改 作用: 在不改变原函数的情况下,对原函数的操作前或者操作后做些改变,这就是装饰 ...
- RTT
Segger RTT的使用 一般arm系统中,如何通过电脑键盘和显示器同mcu进行交互最有效的有两种形式:arm7的semihost,cm时代的traceswo.现在jlink推出了颇具特色的rtt( ...
- [已读]javascript语言精粹
又是一本广为赞颂的好书,当时才刚开始学,啃这本书的时候于是比较困难.记得是有介绍一些js中的“精华”与“糟粕”.
- Linux下命令行中的复制和粘贴
安装gpm:yum install -y gpm* 开启gpm服务:systemctl start gpm 按住鼠标左键,选中想要复制的内容,松开就完成复制,再在复制的位置按右键就完成粘贴.
- javaoo面向对象
- JAVA吃货联盟项目。
1基础通过数组.选择结构.循环等实 现吃货联盟订餐系统. 1.我要订餐: 2.查看餐袋: 3.签收订单: 4.删除订单: 5.我要点赞: 6.退出系统: public class Doy001 { p ...
- 2017“编程之美”终章:AI之战勇者为王
编者按:8月15日,第六届微软“编程之美”挑战赛在选手的火热比拼中圆满落下帷幕.“编程之美”挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起,微软每年都在革新比赛命题.紧跟时代潮流, ...
- POJ 1741 Tree (树的分治,树的重心)
题意:给一棵树,n个节点,给定一个数k,求任意满足dist(a,b)<=k的点对的数量. 思路: 这道题的思路比较简单,但是细节很多. 此题可以用分治法,如何分治? (1)如果path(a,b) ...
- ABC3D创客项目:小风扇
风扇是我们纳凉的好帮手,然而大多的风扇都体积庞大不易携带.利用电池进行供电能让风扇变得更加便捷,下面我们利用电池供电的原理制作出一个风扇. 工作原理: 这个OK风扇的主要能源来自于后面的7号电池,风扇 ...