关于do_pgfault函数的疑问
匿名2023/07/31 19:51:43提问
    lab3student
246

在ucore的do_pgfault函数中,会根据errorcode对权限加以判断,通过权限判断后才会进行处理,否则直接报错。权限判断的代码是这样的:

//check the error_code 排除所有不合法的情况。即一旦不合法就报错退出。
    switch (error_code & 3) {
    default:
            /* error code flag : default is 3 ( W/R=1, P=1): write, present */
            // 这里没有break,即这时也会去检查内存区域是否可写
    case 2: /* error code flag : (W/R=1, P=0): write, not present */
        if (!(vma->vm_flags & VM_WRITE)) {
            cprintf("do_pgfault failed: error code flag = write AND not present, but the addr's vma cannot write\n");
            goto failed;
        }
        break;
    case 1: /* error code flag : (W/R=0, P=1): read, present */
        cprintf("do_pgfault failed: error code flag = read AND present\n");
        goto failed;
    case 0: /* error code flag : (W/R=0, P=0): read, not present */
        if (!(vma->vm_flags & (VM_READ | VM_EXEC))) {
            cprintf("do_pgfault failed: error code flag = read AND not present, but the addr's vma cannot read or exec\n");
            goto failed;
        }
    }

其中,可以发现,当后两位为11,即写一个存在的页时,如果同时保证这个内存区块可以写,则是可以通过上述判断逻辑的。

但是,后面的处理中并没有对这种情况进行处理,请问是为什么?

此外,综合王智默同学的问题,上述权限判断中,为何没有涉及用户态/内核态的判断?

注1:个人认为,写一个物理内存中存在、且权限为可写的页,是不应该发生缺页异常的。

注2:上述代码之后的注释中,明确指出了会有这种情况

IF (write an existed addr ) OR

注3:如果是因为这种情形不会出现缺页异常,也应该报错退出。因为“错误地触发缺页异常”也是运行错误。对于类似的情况,比如“读一个存在的页”理应也是不出现缺页异常的,上面的代码中就在这种情况下报错退出了。

回答(4
    推荐问答
      Simple Empty
      暂无数据