GreyZhang/g_unix: some basic learning about unix operating system. (github.com)

         看了xv6书籍的第二章节之后,决定看看xv6的代码实现。之前已经花了一些时间做lab2,估计这一次看代码应该会顺利一些。找一下对等的功能在xv6中是如何实现的,顺便看看xv6的一些其他的信息。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_JOS

         在xv6中也有一个mmu.h的文件,跟之前试验环境中的应该是一样的东西。之前用过的一些转换功能在这里都找得到。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_unix_02

         这里应该是内核进入后的启动初始化信息的地方,也就是内核中C语言的开始。如果想要再往前一点,那得去找对应的内核启动汇编代码部分。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_服务器_03

         这里能够找到页目录表的信息,而这部分是能够保障最开始的C代码运行的一个很重要的前提。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_unix_04

         这是页目录的定义,正好由此看一下关键参数KERNBASE,因为其他的应该都是一致的套路,然而也看到了这里的初始化用了不同的方法。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_服务器_05

         这样是可以很清楚的知道,其实xv6和JOS的memlayout其实是不相同的。后面,再回到C代码最开始的部分。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_JOS_06

         这里增加了一些lock的概念,暂且不去看。从这个接口以及前面的调用的参数基本上知道,在初始化的时候先进行了4MB的空间初始化用于内核最初的使用。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_MIT_07

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_服务器_08

         之后的操作应该就是内核的页表处理了。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_unix_09

         这里实现了内核的虚拟存储的配置,从行为看,kalloc可能是直接分配了一个page的存储,之后进行了初始化。往后,直接进行了一个映射表的处理。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_服务器_10

         从这里的注释以及实现看,前面的猜测,kalloc分配的是一个page的存储是准确的。继续看了内部的实现,跟之前实现的简单的存储设置相比复杂了不少。涉及到了中断保护以及一些系统本身信息的确认。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_JOS_11

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_服务器_12

         这个功能类似之前调试过的boot_map_region(),把这个函数的代码一起拷贝过来了。当时调试这些接口的时候花了不少时间,看起来是路线错了。如果早看了xv6的书籍以及代码的时候可能会有很大的帮助。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_服务器_13

         之后,切换新的页表。

         之前的lab2中的尝试,其实大概也就实现了这样的一些功能。这一次没有关注太多的细节,但是感觉已经对这个环节的处理也看得有一点理解了。

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_MIT_14

1668_MIT 6.828 xv6代码中虚拟存储的配置实现分析_JOS_15

         最后再看一个对比实现,从这里的确是能够看到xv6代码的简洁紧凑。但是,有时候我又觉得自己的习惯不想更该,因为可能我的这种模式在结构上已经有了一个思维的框架保证我思维的理顺。