【发布时间】:2016-10-01 01:17:21
【问题描述】:
我正在阅读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 内核源代码的知识?
【问题讨论】:
-
是的,我知道那句话的作用。但我不知道 %b1 是什么?