奇怪的RD_PROBE_INT函数,求解!

#define rd_probe_1(ptr)	({ __attribute__((unused)) uint32_t dummy = *(const volatile uint32_t *)(ptr); })

#define rd_probe_num(ptr, num)	({ \
			unsigned tmp; \
			__asm__ __volatile__( \
			"rep; lodsl" \
			: "=S" (tmp), "=c" (tmp) : "S" ((const void *)(ptr)), "c" (num) : "eax"); })

#define wr_probe_1(ptr)	({ asm volatile( "add $0,(%0)" : : "r" (ptr)); })

#define wr_probe_num(ptr, num)	(void)({ \
			unsigned tmp; \
			__asm__ __volatile__( \
			"rep; movsl" \
			: "=D" (tmp), "=S" (tmp), "=c" (tmp) : "D" ((void *)(ptr)), "S" ((void *)(ptr)), "c" (num) :  "eax"); })

rd_probe_1(ptr) 把ptr指向的数据存到局部变量?
rd_probe_num(ptr,num) 把ptr指向的num个数据都装载到eax?
wr_probe_1(ptr) 把0赋给ptr指向的值?
wr_probe_num(ptr,num) 把ptr指向的值copy给自身?
怎么感觉没做什么操作,没啥意义啊!求指点。

这些 PROBE_ Macro 是用来进行指针检验的。

用户程序在内核调用时,会向内核传递指针。内核有时候需要在内核锁定后直接使用这些指针。如果用户传递了非法指针,会导致在内核锁定后发生exception,这会导致内核出错。

为此,内核会在锁定前,先检查这些指针的合法性(按指针的用途检查指针是否可读或可写)。具体的做法就是用PROBE Macro对指针所指的数据强制进行读或写,如果是非法指针,因为尚未内核锁定,内核可以对exception进行处理,返回用户空间,并返回内核调用出错。