__range_ok宏中的汇编代码

时间:2011-09-13 07:37:37

标签: linux kernel arm

你能解释一下这段代码吗?我真的不明白。

请参阅http://lxr.free-electrons.com/source/arch/arm/include/asm/uaccess.h#L70

 #define __addr_ok(addr) ({ \
         unsigned long flag; \
         __asm__("cmp %2, %0; movlo %0, #0" \
                 : "=&r" (flag) \
                 : "" (current_thread_info()->addr_limit), "r" (addr) \
                 : "cc"); \
         (flag == 0); })

 /* We use 33-bit arithmetic here... */
 #define __range_ok(addr,size) ({ \
         unsigned long flag, roksum; \
         __chk_user_ptr(addr);   \
         __asm__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" \
                 : "=&r" (flag), "=&r" (roksum) \
                 : "r" (addr), "Ir" (size), "" (current_thread_info()->addr_limit) \
                 : "cc"); \
         flag; })

这是来自ARM Linux内核,__ range_ok

1 个答案:

答案 0 :(得分:1)

作为有关注册用法和其他装饰的一般信息来源,请查看GCC Extended Inline Assembly的文档

我建议您通过

运行此来源
gcc .... -S

看看产生的结果是什么。

你也可以运行

objdump -dC -S <objectfile.o>

您将需要来自交叉编译器工具链的objdump。 此外,使用调试信息进行编译以获取源注释(-S)。 使用-O0编译以避免因优化而产生混淆。