我正在阅读copy_from_user函数,在copy_from_user函数中,使用了宏__get_user_asm

在Linux中有一个mmap syscall,mmap syscall将调用函数copy_from_user。如果大小恒定,则此函数将使用宏__get_user_asm__get_user_asm的内容是

#define __get_user_asm(x, addr, err, itype, rtype, ltype, errret)   \
asm volatile("1:    mov"itype" %2,%"rtype"1\n"      \
         "2:\n"                     \
         ".section .fixup,\"ax\"\n"             \
         "3:    mov %3,%0\n"                \
         "  xor"itype" %"rtype"1,%"rtype"1\n"       \
         "  jmp 2b\n"                   \
         ".previous\n"                  \
         _ASM_EXTABLE(1b, 3b)               \
         : "=r" (err), ltype(x)             \
         : "m" (__m(addr)), "i" (errret), "0" (err))


当我尝试翻译时
__get_user_asm(*(u8 *)dst, (u8 __user *)src, ret, "b", "b", "=q", 1);到真正的来源,

1: movb %2,%b1\n
2:\n
.section .fixup, "ax" \n
3: mov %3, %0 \n
 **xorb %b1, %b1\n**
 jmp 2b\n
.previous\n

: "=r" (ret), =q(dst)
:"m"(dst), "i"(1), "0"(ret)

.quad "1b", "2b"\n
.previous\n```



有我无法理解的地方。

1,在xorb %b1, %b1中,什么是%b1(b一,不是b L)?

2,在jmp 2b中,2b是标签还是记忆地址?如果2b是标签,我怎么找到这个标签?

3,.quad "1b", "2b"的作用是什么?

在哪里可以获取使我了解语义层中的Linux内核源代码的知识?

最佳答案

读取gcc扩展asm的docs,我们看到%1引用了第二个参数(因为参数号从零开始)。在您的示例中,这是dst

here描述了添加b(即%b1):

Modifier Description                             Operand  masm=att  masm=intel
b        Print the QImode name of the register.  %b0      %al       al


jmp 2b表示向后查找名为2的标签。

.quad指令在here中定义:


  .quad期望零个或多个bignum,以逗号分隔。对于每个
  bignum,它发出一个8字节整数。如果bignum不适合8
  字节,它显示警告消息;并且只接受最低的订单8
  bignum的字节。


至于从何处获取信息,希望我提供的链接有所帮助。

关于linux - xorb%b1,%b1`中的%b1(b one,不是b L)是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39802077/

10-12 17:22