全部学习汇总:GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
这一次,看几个存储管理的辅助接口的实现。
这个接口给出来的提示信息还是很多的,至少从这里能够收集到这个接口实现要用到的一些辅助转换函数以及基本的要求。
这是对本函数接口的一个实现尝试,也按照提示注释中的信息,直接把权限属性分配全了。
这个函数接受三个参数:pgdir是一个指向页目录表的指针,va是要查找的虚拟地址,create表示如果要查找的页表不存在是否要创建。首先,将va的高10位作为页目录项的索引,获取相应的页目录项,保存在pde中。如果该页目录项不存在,则根据create参数决定是否创建它。如果不需要创建或者创建失败,则返回NULL。如果需要创建页目录项,则首先调用page_alloc函数分配一个物理页面,并且将页面清零。然后,将该物理页面的物理地址设置到页目录项中,并设置PTE_P、PTE_U和PTE_W标志。最后,使用虚拟地址KADDR(PTE_ADDR(xxx))将页表的物理地址映射到内核虚拟地址空间,并返回指向相应页表的pte_t类型指针,加上va低12位作为页表项的索引。这里最后一步的转换也非常重要,如果不转换成一个内核的虚拟地址,接下来的访问也会出错。
接下来看page_lookup接口,这个返回的其实是page分配信息而不是page本身。确切说,这个查找查找的是虚拟地址对应的物理page的信息。
这个是按照提示做的一个函数接口的实现。
这个函数接受三个参数:pgdir是一个指向页目录表的指针,va是要查找的虚拟地址,pte_store是一个指向指针的指针,用于保存对应的页表项。首先,调用pgdir_walk函数获取虚拟地址va对应的页表项,并检查page是否存在。如果page不存在,则返回NULL。如果page存在,则使用pte_store参数保存对应的页表项地址,并将物理地址转换成页面结构体并返回。这里使用了宏pa2page和PTE_ADDR,pa2pageE用于将物理地址转换成页面结构体,PTE_ADDR用于提取页表项中的物理地址部分。
相比于walk函数来说,这个lookup函数很大的一个特点是只查找不创建。另外,接口传递的信息进行了进一步的转换,转成了管理所需要的页信息结构体。
这样,继续往下看需要考虑实现page_insert接口。
以上是最初的接口以及实现提示。
这个是对接口的一个实现尝试,但是当前page_remove()接口并没有实现。另一点,关于页表不存在时候的创建,这里是采用给walk接口指定创建符号为true来实现的。
这是最初的接口定义以及提示。
以上是一次尝试实现,但是这次用到了临近的tlb_invalidate()接口。从描述看,应该每一次对TLB,也就是两级查找的表进行修改都应该调用。看起来,前面的插入也应该增加。
按照上面的分析,插入改成如上设计。
继续往下看check_page的测试,主要是针对页面的插入以及移除等操作情况的页页面合理性进行了测试。
测试并没有通过,看起来还是有一些地方没有处理正确。
这个算是自己审题的失误把,当初看到这段的时候以为是注释写错了。先把这部分修正掉,发现前面的问题并没有修正。
以上是修正的方式。
文章来源:https://www.toymoban.com/news/detail-402292.html
再次进行测试测试通过。文章来源地址https://www.toymoban.com/news/detail-402292.html
到了这里,关于1664_MIT 6.828 JOS页管理的相关行为实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!