- 论坛徽章:
- 0
|
比如我写个驱动 ,有个ioctl ,该iocontrol 里有写user data 8K 到kernel
那我就在iocontrol 该item 下实现
tbuf = vmalloc(tbuf_size); /* 在内核分配8K 非连续区*/
if (!tbuf)
return -ENOMEM;
err = copy_from_user(tbuf, buf, len); /*然后call copy from user 去读user buf 到tbuf */
但是tbuf 是vmalloc 在kernel 非连续区分配的page ,虽然没有缺页情况,
但是vmalloc 只更新主内核页表, 而当前进程使用ioctrl 系统调用切入
内核时,进程在内核态使用的是进程当前的页表,那么3G 以上表项开始
是空的,那么访问tbuf ,就是写到tbuf 时应该会引起页表异常,
根据
.macro ldr1w ptr reg abort
100: ldrt \reg, [\ptr], #4
.section __ex_table, "a"
.long 100b, \abort
.previous
.endm
异常处理在abort 处
.section .fixup,"ax"
.align 0
copy_abort_preamble
ldmfd sp!, {r1, r2}
sub r3, r0, r1
rsb r1, r3, r2
str r1, [sp]
bl __memzero
ldr r0, [sp], #4
copy_abort_end
.previous
照道理说这样的异常应该可以修复的,就是修复当前进程页表3g 以上的内存和主内核页表3G以上的一样,这样就可以继续执行了
但是fixup 的代码没有看出有这样的处理
不知道我那步理解不对,请教 |
|