【转载】Linux i386+源码中常见宏标识tag的定义
转载自:http://blog.chinaunix.net/uid-20729583-id-1884553.html
这 些宏包括 __init、__initdata、__initfunc()、asmlinkage、ENTRY()、FASTCALL()等等。它们的定义主要位于 Include/linux/linkage.h和 include/asm-i386/Init.h以及其他一些.h文件中。
1) __init位置:include/asm-i386/Init.h
定义:#define __init __attribute__ ((__section__ (".text.init")))
注释:这个标志符和函数声明放在一起,表示gcc编译器在编译的时候需要把这个函数放.text.init section中,而这个section在内核完成初始化之后,会被释放掉。
举例:asmlinkage void __init start_kernel(void){...}
2) __initdata
位置:include/asm-i386/Init.h
定义:#define __initdata __attribute__ ((__section__ (".data.init")))
注释:这个标志符和变量声明放在一起,表示gcc编译器在编译的时候需要把这个变量放在.data.init section中,而这个section在内核完成初始化之后,会被释放掉。
举例:static struct kernel_param raw_params[] __initdata = {....}
3) __initfunc()
位置:include/asm-i386/Init.h
定义: #define __initfunc(__arginit) \
__arginit __init; \
__arginit
注释: 这个宏用来定义一个 __init 函数。
举例: __initfunc(void mem_init(unsigned long start_mem, unsigned long e
nd_mem)) {....}
4) asmlinkage
位置:Include/linux/linkage.h
定义:#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
注释:这个标志符和函数声明放在一起,告诉gcc编译器该函数不需要通过任何寄存器来传递参数,参数只是通过堆栈来传递。
举例:asmlinkage void __init start_kernel(void){...}
5) ENTRY()
位置:Include/linux/linkage.h
定义: #define ENTRY(name) \
.globl SYMBOL_NAME(name); \
ALIGN; \
SYMBOL_NAME_LABEL(name)
注释: 将name声明为全局,对齐,并定义为标号。
举例: ENTRY(swapper_pg_dir)
.long 0x00102007
.fill __USER_PGD_PTRS-1,4,0
/* default: 767 entries */
.long 0x00102007
/* default: 255 entries */
.fill __KERNEL_PGD_PTRS-1,4,0
等价于
.globl swapper_pg_dir
.align 16,0x90
/* if i486+ */
swapper_pg_dir:
.long 0x00102007
.fill __USER_PGD_PTRS-1,4,0
/* default: 767 entries */
.long 0x00102007
/* default: 255 entries */
.fill __KERNEL_PGD_PTRS-1,4,0
6) FASTCALL()
位置:Include/linux/kernel.h
定义:#define FASTCALL(x) x __attribute__((regparm(3)))
注释:这个标志符和函数声明放在一起,带regparm(3)的属性声明告诉gcc编译器这个函数可以通过寄存器传递多达3个的参数,这3个寄存器依次为EAX、EDX 和 ECX。更多的参数才通过堆栈传递。这样可以减少一些入栈出栈操作,因此调用比较快。
举例:extern void FASTCALL(__switch_to(struct task_struct *prev, struct t
ask_struct *next));
这个例子中,prev将通过eax,next通过edx传递。
【转载】Linux i386+源码中常见宏标识tag的定义的更多相关文章
- linux内核源码中常见宏定义
http://blog.csdn.net/yangdelong/article/details/5508057
- 盘点Linux内核源码中使用宏定义的若干技巧(1)
http://blog.chinaunix.net/uid-23769728-id-3141515.html
- linux内核源码中两个重要的宏
转载:http://www.cnblogs.com/skywang12345/p/3562146.html 倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 containe ...
- Linux内核源码中的likely和unlikely释疑【转】
本文转载自:https://my.oschina.net/armsky/blog/15320 ikely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢? 首 ...
- Linux 内核源码中likely()和unlikely()【转】
本文转载自:http://blog.csdn.net/tigerjibo/article/details/8279183 ikely()与unlikely()在2.6内核中,随处可见,那为什么要用它们 ...
- Linux 内核源码中likely()和unlikely()
ikely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢? 首先明确: if (likely(value))等价于if (value)if (likely( ...
- linux 内核源代码情景分析——linux 内核源码中的汇编语言代码
1. 用汇编语言编写部分核心代码的原因: ① 操作系统内核中的底层程序直接与硬件打交道,需要用到一些专用的指令,而这些指令在C语言中并无对应的语言成分: ② CPU中的一些特殊指令也没有对应的C语言成 ...
- 如何单独编译Linux内核源码中的驱动为可加载模块?
答: 分为两步: 1. 配置某个驱动为模块(如: CONFIG_RTC_XXX=m) 2. 指定路径并编译, 如编译drivers/rtc中的驱动 make SUBDIRS=drivers/rtc m ...
- Linux内核源码特殊用法
崇拜并且转载的: http://ilinuxkernel.com/files/5/Linux_Kernel_Source_Code.htm Linux内核源码特殊用法 1 前言 Linux内核源码主要 ...
随机推荐
- ActiveMQ 使用
ActiveMQ资料大全 官方文档 入门:http://activemq.apache.org/getting-started.html 常见问题:http://activemq.apache.org ...
- P2P资料
常用链接 openstack创建实例的方法 http://www.cnblogs.com/popsuper1982/p/3800426.html qemu官网 http://wiki.qemu.org ...
- 统一回复《怎么学JavaScript?》
作者:小不了链接:https://zhuanlan.zhihu.com/p/23265155来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 鉴于时不时,有同学私信问我( ...
- Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法
由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与Unsafe ...
- 【LeetCode】258. Add Digits (2 solutions)
Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has only ...
- centos7 Linux 尝试使用crontab
一.安装crontab [root@CentOS ~]# yum install vixie-cron[root@CentOS ~]# yum install crontabs 说明:vixie-cr ...
- Nginx 301重定向的配置
301重定向是很常见的需求,比如访问 fz1688.com,自动跳到 www.fz1688.com.或者倒过来,访问 www.fz1688.com 跳到 fz1688.com.Nginx 中配置 30 ...
- 很好的一篇讲LTP在编解码中的作用的文章
原文链接 LONG-TERM PREDICTION by: Adit Aviv Kfir Grichman introduction: The speech signal has been ...
- Android学习笔记----TimerTask中显示Toast的问题
今天想在TimerTask的run函数中调用Toast显示一下提示信息,却总是导致程序崩溃.可是try语句块却又无法捕获到异常,代码如下: ...... Timer timer = new Timer ...
- Web GIS 离线地图
Web GIS 离线地图 1,基于瓦片的离线地图下载 博客园 阿凡卢 提供了离线地图的下载工具,下载地址:http://pan.baidu.com/s/1hqvQr7e 具体使用见 参考资料2 阿凡卢 ...