【发布时间】:2015-06-01 09:10:29
【问题描述】:
我正在阅读一些 ARM 内核源代码,直到我偶然发现了以下函数:-
314 #define __get_user_asm_byte(x, addr, err) \
315 __asm__ __volatile__( \
316 "1: " TUSER(ldrb) " %1,[%2],#0\n" \
317 "2:\n" \
318 " .pushsection .fixup,\"ax\"\n" \
319 " .align 2\n" \
320 "3: mov %0, %3\n" \
321 " mov %1, #0\n" \
322 " b 2b\n" \
323 " .popsection\n" \
324 " .pushsection __ex_table,\"a\"\n" \
325 " .align 3\n" \
326 " .long 1b, 3b\n" \
327 " .popsection" \
328 : "+r" (err), "=&r" (x) \
329 : "r" (addr), "i" (-EFAULT) \
330 : "cc")
调用上下文如下:-
299 #define __get_user_err(x, ptr, err) \
300 do { \
301 unsigned long __gu_addr = (unsigned long)(ptr); \
302 unsigned long __gu_val; \
303 __chk_user_ptr(ptr); \
304 might_fault(); \
305 switch (sizeof(*(ptr))) { \
306 case 1: __get_user_asm_byte(__gu_val, __gu_addr, err); break; \
现在我想澄清一下关于上面的 ARM 程序集的一些疑问。
-
__get_user_asm_byte函数在做什么?我可以看到 r3 被复制到 r0 并且值 0 被移动到 r1。之后它会分支到偏移量 0x2b 吗? - 该函数试图做什么?第 328 行以后的
"+r" (err), "=&r" (x)是什么意思? - 什么是 .pushsection 和 .popsection?
- 为什么为内核编写的 ARM 程序集在语法上如此不同(使用的汇编程序是什么?为什么有
%<regno>而不是r<regno>?)
【问题讨论】:
-
至于 4. — 这是一种汇编语法,如果您告诉 GCC 编译但不汇编 (
-S选项)。 即汇编器应用程序是 GAS。 -
%0不是r0。2b不是0x2b。阅读documentation。 -
@CL。谢谢,有帮助!如果您可以将其添加为答案,我可以接受。
标签: linux linux-kernel arm system-calls