免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6021 | 回复: 9

[内核入门] asmlinkage指定用堆栈传参数,用意是什么?寄存器不是更快吗 [复制链接]

论坛徽章:
2
射手座
日期:2014-09-03 00:18:022015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-08-27 13:49 |显示全部楼层
asmlinkage作用就是告诉编译器,函数参数不是用用寄存器来传递,而是用堆栈来传递的;
网上搜了一下资料,都是介绍asmlinkage是什么的,但是没有介绍为什么要用这个玩意?寄存器的速度比堆栈快很多,为什么要用慢的方式呢,用意为何?


论坛徽章:
2
酉鸡
日期:2013-09-26 11:11:15摩羯座
日期:2014-01-08 13:45:19
发表于 2014-08-27 14:31 |显示全部楼层
比如系统调用必须要用asmlinkage,慢是慢点,但是不同架构的处理方式就一样了

论坛徽章:
2
射手座
日期:2014-09-03 00:18:022015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-08-27 14:47 |显示全部楼层
像glibc这种库完全可以针对不同的平台有不同的编译开关,不能为了代码损失性能呀,呵呵

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
发表于 2014-08-27 22:04 |显示全部楼层
本帖最后由 Tinnal 于 2014-08-27 22:06 编辑

回复 1# wLiu2007

采用asmlinkage,绝对不是因为不同架构可以通用户、。原因是因为用户态寄存器在系统调用进入内核态时,会把用户态的寄存器全部压栈,通过合理的构造。正好满足用户态通过寄存器传递参数,内核态通过栈取参数的标准要求。这是很巧妙的安排,是高效的体现!其实还可以发现,内核只有在系统调用时才用asmlinkage,其它函数都没有。这是有意而为之的。



   

论坛徽章:
2
射手座
日期:2014-09-03 00:18:022015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-08-28 09:15 |显示全部楼层
回复 4# Tinnal

没有看出高效体现在什么地方;
因为寄存器中已经有了需要的参数,堆栈里面也只是寄存器的一份copy而已,两者都可以用,那为什么不用速度快的寄存器呢?


   

论坛徽章:
0
发表于 2014-08-28 11:55 |显示全部楼层
用户态到内核态的切换要做很多工作的, 不是简单的函数调用来的。

类似的问题,
为啥关机时候数据都写到磁盘重新开机再读呢呢,内存不能不是更快么?
为啥复制文件到其他机器需要先复制到u盘呢,内存不是更快么?

论坛徽章:
2
射手座
日期:2014-09-03 00:18:022015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-08-28 12:57 |显示全部楼层
回复 6# hmsghnh

你举得例子没有可比性呀,呵呵
内存掉电后,信息都没有了,怎么用

系统调用做的工作虽然不止函数调用,但是其本质就是现场保护、压栈之类的操作;
还是没有想明白高效在哪里,为什么这么用?

   

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
发表于 2014-08-28 14:10 |显示全部楼层
回复 5# wLiu2007
因为SWI汇编路径也要使用寄存器,如果要把用户态的寄存器平行传过去,中间就得再来一轮压栈和弹栈。


   

论坛徽章:
0
发表于 2014-08-28 14:29 |显示全部楼层
确实很多架构里面参数是通过寄存器传递的。
http://www.freebsd.org/doc/en/bo ... 6-system-calls.html
http://www.x86-64.org/documentation/abi.pdf
http://man7.org/linux/man-pages/man2/syscall.2.html
http://lwn.net/Articles/456731/
这个很多传参数方法很多不一样的,由 定义的AB规范决定。 i386  架构应该两种方式都可以。

论坛徽章:
0
发表于 2014-08-28 15:35 |显示全部楼层
像楼上各位所说,用户调用syscall的时候,参数都是通过寄存器传进来的。中间内核由把所有的参数压栈了, 所以这个asmlinkage可以通过到gcc,恰好可以用正确的调用方式取到参数。

内核前面的那些统一处理很重要,这样后端真正的的syscall 实现函数就可以得到统一的调用方式了,而不是之间面对不同的abi。确实比较方便了。
不然每个syscall函数里面都要自己去处理不同abi,多很多重复代码。

当然也可以考虑在这个统一的处理的时候,把参数全部按照一定的规范放到寄存器。 但这个方法不能在所有的cpu架构上面都做的到。

我觉得这里的选择,“统一”要比这个“寄存器传参”要重要。    从用户切换到内核,要做大量的处理。相比较其他部分,这点参数的开销实在不算什么。









您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP