Chinaunix首页 | 论坛 | 博客
  • 博客访问: 718544
  • 博文数量: 192
  • 博客积分: 2653
  • 博客等级: 少校
  • 技术积分: 1623
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 18:25
个人简介

How tough life is, how strong you should be!

文章分类

全部博文(192)

文章存档

2015年(1)

2014年(2)

2013年(37)

2012年(152)

分类: LINUX

2012-07-17 22:55:46

asmlinkage是个宏,使用它是为了保持参数在stack中。
   
    看一下/usr/include/asm/linkage.h里面的定义:
   
    #define asmlinkage CPP_ASMLINKAGE __attribute__((regp(0)))
   
    其中 __attribute__是关键字,是gcc的C语言扩展。
   
    __attribute__机制是GNU C的一大特色,它可以设置函数属性、变量属性和类型属性等。可以通过它们向编译器提供更多数据,帮助编译器执行优化等。
   
    __attribute__((regp(0))):告诉gcc编译器该函数不需要通过任何寄存器来传递参数,参数只是通过堆栈来传递。
   
    __attribute__((regp(3))):告诉gcc编译器这个函数可以通过寄存器传递多达3个的参数,这3个寄存器依次为EAX、EDX 和 ECX.更多的参数才通过堆栈传递。这样可以减少一些入栈出栈操作,因此调用比较快。
   
    asmlinkage大都用在系统调用中。有一些情况下是需要明确的告诉编译器,我们是使用stack来传递参数的,比如X86中的系统调用,是先将参数压入stack以后调用sys_*函数的,所以所有的sys_*函数都有asmlinkage来告诉编译器不要使用寄存器来编译
阅读(771) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~