1664_MIT 6.828 JOS页管理的相关行为实现

         全部学习汇总:GreyZhang/g_unix: some basic learning about unix operating system. (github.com)

         这一次,看几个存储管理的辅助接口的实现。

1664_MIT 6.828 JOS页管理的相关行为实现_第1张图片

         这个接口给出来的提示信息还是很多的,至少从这里能够收集到这个接口实现要用到的一些辅助转换函数以及基本的要求。

1664_MIT 6.828 JOS页管理的相关行为实现_第2张图片

         这是对本函数接口的一个实现尝试,也按照提示注释中的信息,直接把权限属性分配全了。

         这个函数接受三个参数:pgdir是一个指向页目录表的指针,va是要查找的虚拟地址,create表示如果要查找的页表不存在是否要创建。首先,将va的高10位作为页目录项的索引,获取相应的页目录项,保存在pde中。如果该页目录项不存在,则根据create参数决定是否创建它。如果不需要创建或者创建失败,则返回NULL。如果需要创建页目录项,则首先调用page_alloc函数分配一个物理页面,并且将页面清零。然后,将该物理页面的物理地址设置到页目录项中,并设置PTE_P、PTE_U和PTE_W标志。最后,使用虚拟地址KADDR(PTE_ADDR(xxx))将页表的物理地址映射到内核虚拟地址空间,并返回指向相应页表的pte_t类型指针,加上va低12位作为页表项的索引。这里最后一步的转换也非常重要,如果不转换成一个内核的虚拟地址,接下来的访问也会出错。

1664_MIT 6.828 JOS页管理的相关行为实现_第3张图片

         接下来看page_lookup接口,这个返回的其实是page分配信息而不是page本身。确切说,这个查找查找的是虚拟地址对应的物理page的信息。

1664_MIT 6.828 JOS页管理的相关行为实现_第4张图片

         这个是按照提示做的一个函数接口的实现。

         这个函数接受三个参数:pgdir是一个指向页目录表的指针,va是要查找的虚拟地址,pte_store是一个指向指针的指针,用于保存对应的页表项。首先,调用pgdir_walk函数获取虚拟地址va对应的页表项,并检查page是否存在。如果page不存在,则返回NULL。如果page存在,则使用pte_store参数保存对应的页表项地址,并将物理地址转换成页面结构体并返回。这里使用了宏pa2page和PTE_ADDR,pa2pageE用于将物理地址转换成页面结构体,PTE_ADDR用于提取页表项中的物理地址部分。

         相比于walk函数来说,这个lookup函数很大的一个特点是只查找不创建。另外,接口传递的信息进行了进一步的转换,转成了管理所需要的页信息结构体。

1664_MIT 6.828 JOS页管理的相关行为实现_第5张图片

         这样,继续往下看需要考虑实现page_insert接口。

1664_MIT 6.828 JOS页管理的相关行为实现_第6张图片

         以上是最初的接口以及实现提示。

1664_MIT 6.828 JOS页管理的相关行为实现_第7张图片

         这个是对接口的一个实现尝试,但是当前page_remove()接口并没有实现。另一点,关于页表不存在时候的创建,这里是采用给walk接口指定创建符号为true来实现的。

1664_MIT 6.828 JOS页管理的相关行为实现_第8张图片

         这是最初的接口定义以及提示。

1664_MIT 6.828 JOS页管理的相关行为实现_第9张图片

         以上是一次尝试实现,但是这次用到了临近的tlb_invalidate()接口。从描述看,应该每一次对TLB,也就是两级查找的表进行修改都应该调用。看起来,前面的插入也应该增加。

1664_MIT 6.828 JOS页管理的相关行为实现_第10张图片

         按照上面的分析,插入改成如上设计。

         继续往下看check_page的测试,主要是针对页面的插入以及移除等操作情况的页页面合理性进行了测试。

1664_MIT 6.828 JOS页管理的相关行为实现_第11张图片

         测试并没有通过,看起来还是有一些地方没有处理正确。

1664_MIT 6.828 JOS页管理的相关行为实现_第12张图片

         这个算是自己审题的失误把,当初看到这段的时候以为是注释写错了。先把这部分修正掉,发现前面的问题并没有修正。

1664_MIT 6.828 JOS页管理的相关行为实现_第13张图片

         以上是修正的方式。

1664_MIT 6.828 JOS页管理的相关行为实现_第14张图片

         再次进行测试测试通过。

你可能感兴趣的:(Linux,unix,unix,linux,JOS,MIT,kernel)