当前位置: 首页 > news >正文

免费b站不收费网站2023/哈尔滨关键词优化方式

免费b站不收费网站2023,哈尔滨关键词优化方式,基础html网页模板,做区位分析底图的网站linux内核中的fastcall和asmlinkage宏 内核版本:2.6.14 嵌入式开发交流群:289195589,欢迎加入!在linux内核中我们都会经常见到FASTCALL和armlinkage,它们各有什么不同呢?下面我们来具体分析一下。在标准C系…

linux内核中的fastcall和asmlinkage宏

内核版本:2.6.14

嵌入式开发交流群:289195589,欢迎加入!

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

在标准C系中函数的形参在实际传入参数的时候会涉及到参数存放的问题,那么这些参数存放在哪里呢?对x86比较了解的话,应该知道这些函数参数和函数内部局部变量一起被分配到了函数的局部堆栈中。linux操作系统支持多种CPU架构,比如x86、ppc和arm等,在不同的处理器结构上不能保证都是通过 局部栈传递参数的。ARM对函数调用过程中的传参定义了一套规则,即 ATPCS,规则中明确指出ARM中R0-R4都是作为通用寄存器使用,在函数调用时处理器从R0-R4中获取参数,在函数返回时再 将需要返回的参数一次存到R0-R4中,也就是说可以将函数参数直接存放在寄存器中,所以为了严格区别函数参数的存放位置,引入了两个标记,即 asmlinkage和FASTCALL,前者表示将函数参数存放在局部栈中,后者则是通知编译器将函数参数用寄存器保存起来。

1.x86平台

#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
#define FASTCALL(x)	x __attribute__((regparm(3)))
#define fastcall	__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处理器的<asm/linkage.h>,没有定义FASTCALL和armlinkage,所以没有意义(对于ARM平台来说,要符合ATPCS过程调用标准,即通过寄存器传递的。ARM中R0-R4用于存放传入参数,所有函数的参数不应该大于5个,如果超过5个,多余的参数被存放到局部栈中。)。 

#ifndef FASTCALL
#define FASTCALL(x)	x
#define fastcall
#endif#ifndef asmlinkage
#define asmlinkage CPP_ASMLINKAGE
#endif

3.CPP_ASMLINKAGE

#ifdef __cplusplus
#define CPP_ASMLINKAGE extern "C"
#else
#define CPP_ASMLINKAGE
#endif

extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。
  (1) 被extern "C"限定的函数或变量是extern类型的extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern “C”修饰。
  (2) 被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

http://www.lbrq.cn/news/1461151.html

相关文章:

  • 网站开发笔记/问卷调查网站
  • 网站建设用什么软件/网络营销方法
  • 有哪些程序网站/百度关键词搜索量统计
  • 济南 规划 网站/seo系统源码出售
  • 电视剧下载网站 免费糖醋蒜怎样做/扬州seo
  • 国内优秀网站设计师/武汉seo报价
  • 装饰公司怎样做网站/打开百度搜索网站
  • 什么做直播网站好/广东vs北京首钢
  • 企业网站跟微信支付怎么做/阿里云免费域名
  • 常州市天宁区建设局网站/百度网盘24小时人工电话
  • 东莞网站推广流程/网站开发建站
  • 安卓app开发模板/化工seo顾问
  • 哪家网站建设公司比较好/最近几天新闻大事
  • 温州哪里有网站建设/楼市最新消息
  • wordpress 侧边栏浮动/百度小程序优化排名
  • 电子商务网站建设交印花税吗/广州营销推广
  • 网站前端用什么做/巨量千川广告投放平台
  • 求一个用css写的点击左边导航栏右边显示内容的网站/seo搜索引擎优化岗位要求
  • 贵阳做网站优化/百度关键词优化师
  • 做的网站里面显示乱码怎么解决方法/ip网站查询服务器
  • 电商网站建设包括哪些内容/百度ai助手入口
  • wordpress audio/企业seo推广
  • 做网站数据存在哪里/百度下载app下载安装
  • 关于dw做网站/贵州二级站seo整站优化排名
  • 闵行区建设和管理委员会网站/抖音seo搜索引擎优化
  • 企业集团网站建设方案/新郑网络推广外包
  • 8网站建设做网站/关键词优化排名软件
  • 如何设置网站标题/全国免费发布信息平台
  • 网站需不需要备案/优化设计七年级下册数学答案
  • 用asp.net做企业网站/适合seo优化的网站
  • 第13章 文件输入/输出
  • 研报复现|史蒂夫·路佛价值选股法则
  • day 44 文件的规范书写与拆分
  • lumerical——锥形波导偏振转换
  • MC0364魔法链路
  • 【RK3568 RTC 驱动开发详解】