有个arm copy form user的情景没想通

发布于 2022-10-15 06:13:43 字数 1955 浏览 23 评论 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 的代码没有看出有这样的处理
不知道我那步理解不对,请教

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

真心难拥有 2022-10-22 06:13:43

兄弟们也没想通?

扬花落满肩 2022-10-22 06:13:43

本帖最后由 ioriyw 于 2011-05-25 10:57 编辑

所有进程3g以上的页表(768以上)是共享的(指针方式 ,一个页目录项其实就是个指针,指向内核页表项,也就是共享),也就是内核页表。
至于何时共享,是页面异常处理过程中逐步设置的。可参考页面异常处理函数。

慵挽 2022-10-22 06:13:43

你没理解我问的意思,我的理解是会发生异常,并修复,但是fixup 应该跳到原来发生的指令再执行一下,但是fixup 的代码没看出来,比如b 100 去重新执行

半衬遮猫 2022-10-22 06:13:43

估计没在fixup返回吧,异常处理函数中返回的吧

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文