免费注册 查看新帖 |

Chinaunix

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

[硬件及驱动] linux 内核态指定 call convention [复制链接]

论坛徽章:
0
发表于 2012-07-06 11:34 |显示全部楼层
本帖最后由 SZ_DIV8 于 2012-07-06 11:40 编辑

Hi,各位好:
遇到问题像大家请教:
          linux 内核态 默认的call convention 是什么(我测试Fedora 10时发现好像是fastcall)?可否更改(直接在函数上加__attribute__((cdecl)) 好像不起作用)??
               基于  Fedora 10  
              1.在linux驱动中需要调用 一个VC编译的Bin 文件中的函数,该Bin中的函数是用 _cdecl 的方式(堆栈)传参数
              2.而我发现 我们在liunx 内核态的函数都用 fastcall(寄存器传参数),导致调用失败
              3.请问下, 如何才能 在 make  linux 驱动的时候 指定  call convention???
        谢谢,盼指点
刚才发到别的板块去了,感觉在这个板块发比较符合!!

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2012-07-06 13:03 |显示全部楼层
32位还是64位的?据说x86_64全部是用寄存器传参。32位的话,默认情况下都是用栈传参,除非声明时加regparam。编译器也有可能做某些优化,内核里好像定义了asmlinkage可以展开为让GCC不优化参数的附加声明。

另外,你们怎么知道是失败是传参引起的?那个bin文件那么干净,没做系统调用,没引用其它库,没假定WINDOWS上的某些特性?

论坛徽章:
0
发表于 2012-07-06 13:53 |显示全部楼层
回复 2# tempname2


    感谢回复,
    我们有验证过, 用VC编译 那个Bin file 时,如果指定为 fastcall 方式,则 内核态 code 可以调用 Bin file 内的函数,同时我们也 反汇编看过,确实是内核态在用 寄存器传参数
       而用户态 的程序用gcc  编译后 ,我反汇编看了下, 是用堆栈来传递的,  加上 __attribute__((fastcall))后,可切换成寄存器方式传参数, 也就是说,在用户态, 加属性时起作用的, 在内核态则加了 属性 和没加属性 反汇编的代码是一样的!!!!
        现在是 我们不想改那个 Bin file 的call convention,  所以必须找一个办法使得 我的linux 内核态code 也用 堆栈方式来传递参数,不知道您还有何看法???  谢谢~~~~

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2012-07-06 15:21 |显示全部楼层
声明时加asmlinkage试试, 参考arch/x86/include/asm/syscalls.h

论坛徽章:
0
发表于 2012-07-06 18:28 |显示全部楼层
回复 4# tempname2


    尝试添加 __attribute__((regparm(0)))可实现call covention 转化(由内核态寄存器 传递方式改为堆栈方式),待进一步实验

   多谢您的回复,从您的回复中找到了线索,谢谢哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP