您的位置 首页 新品

linux内核中的fastcall和asmlinkage宏

内核版本:2614在linux内核中我们都会经常见到FASTCALL和armlinkage,它们各有什么不同呢?下面我们来具体分析一下。在标准C系中函数的形

内核版别:2.6.14

linux内核中咱们都会常常见到FASTCALL和armlinkage,它们各有什么不同呢?下面咱们来具体分析一下。

在规范C系中函数的形参在实践传入参数的时分会涉及到参数寄存的问题,那么这些参数寄存在哪里呢?对x86比较了解的话,应该知道这些函数参数和函数内部部分变量一同被分配到了函数的部分仓库中。linux操作体系支撑多种CPU架构,比方x86、ppc和arm等,在不同的处理器结构上不能确保都是经过 部分栈传递参数的。ARM对函数调用进程中的传参界说了一套规矩,即 ATPCS,规矩中清晰指出ARM中R0-R4都是作为通用寄存器运用,在函数调用时处理器从R0-R4中获取参数,在函数回来时再 将需求回来的参数一次存到R0-R4中,也就是说能够将函数参数直接寄存在寄存器中,所以为了严厉差异函数参数的寄存方位,引入了两个符号,即 asmlinkage和FASTCALL,前者标明将函数参数寄存在部分栈中,后者则是告知编译器将函数参数用寄存器保存起来。

1.x86渠道

[plain]view plaincopy

print?

  1. #defineasmlinkageCPP_ASMLINKAGE__attribute__((regparm(0)))
  2. #defineFASTCALL(x)x__attribute__((regparm(3)))
  3. #definefastcall__attribute__((regparm(3)))

函数界说前加宏asmlinkage,标明这些函数经过仓库而不是经过寄存器传递参数。gcc编译器在汇编进程中调用c言语函数时传递参数有两种办法:一种是经过仓库,另一种是经过寄存器。缺省时选用寄存器,假设你要在你的汇编进程中调用c言语函数,而且想经过仓库传递参数,你界说的c函数时要在函数前加上宏asmlinkage。

其间 __attribute__是关键字,是gcc的c言语扩展。__attribute__机制是GNU C的一大特征,它能够设置函数特点、变量特点和类型特点等。能够经过它们向编译器供给更多数据,协助编译器履行优化等。
__attribute__((regparm(0))):告知gcc编译器该函数不需求经过任何寄存器来传递参数,参数仅仅经过仓库来传递。
__attribute__((regparm(3))):告知gcc编译器这个函数能够经过寄存器传递多达3个的参数,这3个寄存器依次为EAX、EDX 和 ECX。更多的参数才经过仓库传递。这样能够削减一些入栈出栈操作,因而调用比较快。
asmlinkage大都用在体系调用中。有一些情况下是需求清晰的告知编译器,咱们是运用stack来传递参数的,比方x86中的体系调用,是先将参数压入stack今后调用sys_*函数的,所以一切的sys_*函数都有asmlinkage来告知编译器不要运用寄存器来编译。

2.arm渠道

关于arm处理器的,没有界说FASTCALL和armlinkage,所以没有意义(关于ARM渠道来说,要契合ATPCS进程调用规范,即经过寄存器传递的。ARM中R0-R4用于寄存传入参数,一切函数的参数不应该大于5个,假如超越5个,剩余的参数被寄存到部分栈中。)。

[plain]view plaincopy

print?

  1. #ifndefFASTCALL
  2. #defineFASTCALL(x)x
  3. #definefastcall
  4. #endif
  5. #ifndefasmlinkage
  6. #defineasmlinkageCPP_ASMLINKAGE
  7. #endif

3.CPP_ASMLINKAGE

[plain]view plaincopy

print?

  1. #ifdef__cplusplus
  2. #defineCPP_ASMLINKAGEextern”C”
  3. #else
  4. #defineCPP_ASMLINKAGE
  5. #endif

extern “C” 包括两层意义,从字面上即可得到:首要,被它润饰的方针是“extern”的;其次,被它润饰的方针是“C”的。
  (1) 被extern “C”限制的函数或变量是extern类型的extern是C/C++言语中标明函数和全局变量效果规模(可见性)的关键字,该关键字告知编译器,其声明的函数和变量能够在本模块或其它模块中运用。与extern对应的关键字是static,被它润饰的全局变量和函数只能在本模块中运用。因而,一个函数或变量只或许被本模块运用时,其不或许被extern “C”润饰。
  (2) 被extern “C”润饰的变量和函数是依照C言语方法编译和衔接的。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/262396.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部