免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2532 | 回复: 4
打印 上一主题 下一主题

有个arm copy form user的情景没想通 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-24 11:05 |只看该作者 |倒序浏览
比如我写个驱动 ,有个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 的代码没有看出有这样的处理
不知道我那步理解不对,请教

论坛徽章:
0
2 [报告]
发表于 2011-05-24 15:35 |只看该作者
兄弟们也没想通?

论坛徽章:
0
3 [报告]
发表于 2011-05-25 10:54 |只看该作者
本帖最后由 ioriyw 于 2011-05-25 10:57 编辑

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

论坛徽章:
0
4 [报告]
发表于 2011-05-26 10:50 |只看该作者
你没理解我问的意思,我的理解是会发生异常,并修复,但是fixup 应该跳到原来发生的指令再执行一下,但是fixup 的代码没看出来,比如b 100 去重新执行

论坛徽章:
0
5 [报告]
发表于 2011-05-26 21:25 |只看该作者
估计没在fixup返回吧,异常处理函数中返回的吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP