pmap.c里的权限关系

61 views
Skip to first unread message

Chunis Deng

unread,
May 5, 2012, 1:58:16 AM5/5/12
to xv6-jos
lab2, part2,kern/pmap.c的函数 check_page() 中, 这一段怎么理解?

    // should be able to change permissions too.
    assert(page_insert(kern_pgdir, pp2, (void*) PGSIZE, PTE_W|PTE_U) == 0);
    assert(check_va2pa(kern_pgdir, PGSIZE) == page2pa(pp2));
    assert(pp2->pp_ref == 1);
    assert(*pgdir_walk(kern_pgdir, (void*) PGSIZE, 0) & PTE_U);
    assert(kern_pgdir[0] & PTE_U);

感觉其意思是,插入page的时候,提供了perm,这个perm不仅会影响其pte,而且会影响其pde?

王越

unread,
May 6, 2012, 9:14:18 PM5/6/12
to xv6...@googlegroups.com
这和测试流程有关,插页的时候空闲页表队列里面只有一个页,而插页除了页表中对应的位置中占用一页之外,页表在页目录表中的位置可能也是空的,所以一个插入过程可能需要两个物理页。首先取一页插入到页目录表作为页表,这个时候已经没有空闲页了,所以插入由于内存不足而插入失败

Chunis Deng

unread,
May 6, 2012, 11:04:15 PM5/6/12
to xv6...@googlegroups.com
嗯,这个我明白。

我本来的疑问是为什么对页面设置的权限(PTE_U)会向上传递到页目录上去。
我还查了一下,发现2007年的lab是没有这个检测的: assert(kern_pgdir[0] & PTE_U);

后来看到注释里说:
// Hint 2: the x86 MMU checks permission bits in both the page directory
// and the page table, so it's safe to leave permissions in the page
// more permissive than strictly necessary.
所以我将页目录的权限直接设置为了: *ptp = PTE_ADDR(PADDR(pte)) | PTE_U | PTE_W | PTE_P;
然后该检测就通过了,因此我推测:不存在权限向上传递的问题。页目录这样设置也许是伏笔”...  :-)

Sunus Lee

unread,
Nov 29, 2013, 2:55:42 AM11/29/13
to xv6...@googlegroups.com
对, 我的疑问正和你一样. 不知道为何页的权限会传递到页目录.
看我新发的post. 不知道你现在有答案了没?

黄攀

unread,
Dec 4, 2013, 6:45:55 AM12/4/13
to xv6...@googlegroups.com
在调用page_insert插入新页表项时,page_insert会先调用pgdir_walk去找到对应的页表项地址,而在pgdir_walk中,它会先找到页表在页目录中的的地址,如果发现页目录中该项尚不存在,且传给pgdir_walk的第三个参数create为1,就会主动先分配一页作为页表,并且将该页物理地址与一堆权限相或,得到的东西放入页目录项中,这些权限就是页目录项的初始权限来源了。反正我是创建所有页目录项时都给了这些权限 : PTE_U | PTE_W | PTE_P, 所以天生自带PTE_U属性( ^_^ )。反正它也说了,页目录里权限无所谓,反正还要经过页表权限那一关的审查。。。

在 2013年11月29日星期五UTC+8下午3时55分42秒,Sunus Lee写道:
Reply all
Reply to author
Forward
0 new messages