设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
小说专版  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专   题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: 刺猬宫 >> Linux专题 >> 开源空间 >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
新手学堂:学习Linux编程…
新手看招 Linux操作系统…
高手进阶 Linux系统下MT…
感染Linux系统脚本程序的…
Linux开发模式存在的缺陷…
Linux系统Shell的环境变…
Linux操作系统的声音设备…
Linux操作系统的源代码目…
开源守则 UNIX/BSD/Linu…
Linux TCP/IP协议栈的通…
  Linux i386+源码中常见宏标识tag的定义           
Linux i386+源码中常见宏标识tag的定义
 

些宏包括 __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传递。(T002)

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2007-7-14 12:35:58
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:itqoo    责任编辑:itqoo 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持