- 论坛徽章:
- 0
|
在 put_user() 和 get_user() 函数的定义中,都可以看到:
__chk_user_ptr(x) 这个宏(内核版本: 2.6.31)。
查一下这个宏的定义是:
# define __chk_user_ptr(x) (void)0
我不明白这里使用了 __chk_user_ptr(x) 这个宏的用处是什么?
如我在一个测试程序里,也模拟定义这样的一个宏,但是反汇编看了一下,也没有什么对应的汇编语句:
m[3] = m[3] + 1;
80483d7: 8b 45 f0 mov -0x10(%ebp),%eax
80483da: 83 c0 01 add $0x1,%eax
80483dd: 89 45 f0 mov %eax,-0x10(%ebp)
chk_user_ptr(p);
m[2] = m[2] + 1;
80483e0: 8b 45 ec mov -0x14(%ebp),%eax
80483e3: 83 c0 01 add $0x1,%eax
80483e6: 89 45 ec mov %eax,-0x14(%ebp)
而 put_user() 函数会调用到:
__put_user_x() 这样的一个宏,而此宏的定义是:
#define __put_user_x(size, x, ptr, __ret_pu) \
asm volatile("call __put_user_" #size : "=a" (__ret_pu) \
: "0" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx")
这里,是不是说 ptr 这个指针是装进 ecx 这个寄存器的呢?那这和 __chk_user_ptr(ptr) 有什么联系?
请大家指点迷津,谢谢了。 |
|