我正在阅读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/