简介:
       内核总要和用户打交道,比如从用户提供的buffer中拷贝数据等等。为了保证kernel的安
全,这种操作需要格外小心。 有可能用户提供的buffer没有初始化,或者是空指针,无论如何内
核都应该能应对这种事情。
       看一个例子,arch/i386/lib/usercopy.c

#define  __do_strncpy_from_user \
do {									   \
	int __d0, __d1, __d2;						   \
	__asm__ __volatile__(						   \
		"	testl %1,%1\n"					   \
		"	jz 2f\n"					   \
		"0:	lodsb\n"					   \
		"	stosb\n"					   \
		"	testb %%al,%%al\n"				   \
		"	jz 1f\n"					   \
		"	decl %1\n"					   \
		"	jnz 0b\n"					   \
		"1:	subl %1,%0\n"					   \
		"2:\n"							   \
		".section .fixup,\"ax\"\n"				   \
		"3:	movl %5,%0\n"					   \
		"	jmp 2b\n"					   \
		".previous\n"						   \
		".section __ex_table,\"a\"\n"				   \
		"	.align 4\n"					   \
		"	.long 0b,3b\n"					   \
		".previous"						   \
		: "=d"(res), "=c"(count), "=&a" (__d0), "=&S" (__d1),	   \
		  "=&D" (__d2)						   \
		: "i"(-EFAULT), "0"(count), "1"(count), "3"(src), "4"(dst) \
		: "memory");						   \
} while (0)

      首先注意到.section .fixup 链接指令将修复内核的代码放入代码断.fixup, 将一个对应
关系 0b,3b(这是内嵌汇编的label)放入section __ex_table, 意思是说,如果0b出现page fault,
GP错误等就跳转到3b执行./arch/i386/extable.c正是实现在__ex_table中查找0b返回3b的功能.代码极为简单不再
列举代码. 只是注意,内核模块也是内核的一部分,也会有这种事情需要处理,这个文件中也有对模
块进行搜索查找. 

      文件提供的函数search_exception_table在do_page_fault,do_trap,do_general_protection
都有使用,正是这一机制的具体实现.