简介:
内核总要和用户打交道,比如从用户提供的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
都有使用,正是这一机制的具体实现.