免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1743 | 回复: 6
打印 上一主题 下一主题

[通信方式] 求问---内核代码--put_user实现的一个小问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-11 16:49 |只看该作者 |倒序浏览
本帖最后由 runrun_snail 于 2013-07-11 18:29 编辑

#define __put_user_asm(x, addr, err, itype, rtype, ltype, errret)        \
__asm__ __volatile__(         \
"1:        mov"itype" %"rtype"1,%2\n"         \
"2:\n"         \
".section .fixup,\"ax\"\n"         \
"3:        movl %3,%0\n"         \
"        jmp 2b\n"         \
".previous\n"         \
".section __ex_table,\"a\"\n"         \
"        .align 4\n"         \
"        .long 1b,3b\n"         \
".previous"         \
: "=r"(err)         \
: ltype (x), "m"(__m(addr)), "i"(errret), "0"(err))

其他的都好理解  不懂rtype这个参数的含义  
举例:
__put_user_asm(x,ptr,retval,"w","w","ir",errret);break;

替换以后  1: movw %w1 %2
%1 之间的w 有什么含义呢?

同意的问题出现在  内存栅栏的  实现中

#define alternative(oldinstr, newinstr, feature)         \
asm volatile ("661:\n\t"
oldinstr "\n
   662:\n"               \
              ".section .altinstructions,\"a\"\n"                  \
      "  .align 4\n"                \
      "  .long 661b\n"            /* label */          \
      "  .long 663f\n"           /* new instruction */         \
      "  .byte %c0\n"             /* feature bit */    \
      "  .byte 662b-661b\n"       /* sourcelen */      \
      "  .byte 664f-663f\n"       /* replacementlen */ \
      ".previous\n"         \
      ".section .altinstr_replacement,\"ax\"\n"         \
      "663:\n\t" newinstr "\n664:\n"   /* replacement */    \
      ".previous"
      :
      : "i" (feature)
  : "memory")  

%0 中间的c有什么含义??

求大神回答。

论坛徽章:
0
2 [报告]
发表于 2013-07-11 18:28 |只看该作者
自己顶 顶顶顶

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
3 [报告]
发表于 2013-07-11 21:23 |只看该作者
回复 1# runrun_snail

这个c是表示byte 8BIT宽度 w表示的是short,就是16BIT宽度
   

论坛徽章:
0
4 [报告]
发表于 2013-07-12 09:46 |只看该作者
jeppeter 发表于 2013-07-11 21:23
回复 1# runrun_snail

这个c是表示byte 8BIT宽度 w表示的是short,就是16BIT宽度


占位符 %1 %2之间 还要加 限制字符的 语法以前还从来没看到过...
可以google到相关内容吗???或者哪里可以找到相关资料吗? 求问。。。

这个c是表示byte 8BIT宽度  

在网上查到另一种说法 跟你的回复不一样  

%0 前面要用 c 这个前缀表示产生最后的结果就是去掉 $ 这个语法符号(不用则生成 $22)。

不知道哪个是正确的。。。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
5 [报告]
发表于 2013-07-12 10:20 |只看该作者
一半人我不告诉他的神级教程:

http://locklessinc.com/articles/gcc_asm/

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
6 [报告]
发表于 2013-07-12 11:03 |只看该作者
回复 5# 帅绝人寰
一般人都不知道啊

   

论坛徽章:
0
7 [报告]
发表于 2013-07-12 17:10 |只看该作者
帅绝人寰 发表于 2013-07-12 10:20
一半人我不告诉他的神级教程:

http://locklessinc.com/articles/gcc_asm/


确实是神级教程。。。

X86 Operand Modifiers 这一节找找到了完整的解释。。。

郁闷的是跟内核代码上面的用法不一样。。。不知道到底哪个对
不深究了,大概知道什么意思了

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP