有个arm copy form user的情景没想通
比如我写个驱动 ,有个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 的代码没有看出有这样的处理
不知道我那步理解不对,请教
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
兄弟们也没想通?
本帖最后由 ioriyw 于 2011-05-25 10:57 编辑
所有进程3g以上的页表(768以上)是共享的(指针方式 ,一个页目录项其实就是个指针,指向内核页表项,也就是共享),也就是内核页表。
至于何时共享,是页面异常处理过程中逐步设置的。可参考页面异常处理函数。
你没理解我问的意思,我的理解是会发生异常,并修复,但是fixup 应该跳到原来发生的指令再执行一下,但是fixup 的代码没看出来,比如b 100 去重新执行
估计没在fixup返回吧,异常处理函数中返回的吧