GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
这一个接口我其实是尝试做第二次分析了,第一次分析的时候只是很容易看懂了这个简单的处理逻辑。但是,这一段在代码应用中究竟会发挥什么作用是没有弄清楚的。这一次,基本上是有一个理解的框架了。
首先需要知道的是KVA,内核虚拟地址的范围。这个地址其实就是软件编译之后链接器分配的地址,JOS把内核的部分分配到了KERNBASE + 1MB的位置。因此,上面的处理所获得的物理地址其实是一个1MB开始往后的地址。为什么会是这样子呢?其实这个正好是现实中JOS被加载到的物理存储的位置。这个加载的动作是由BootLoader来做的。这样,之前一直弄不明白的这个1MB的差异也就能够清楚了。而这样的一个转换理念会在接下来的代码实现中用得上。
这是i386初始化中调用的存储的初始化,从注释信息看,这个是要配置一个量级页表。kern_pgdir是root的虚拟地址。这一部分只是设置内核所用的地址空间,而不是用户的地址空间。这个空间的看见,看了前面的memlayout感觉也有了一定的思维模型可以参考了。而上面涉及到了这次调用中的第一个接口调用,i386_detect_memory(),这是一个很底层的判断,用来检查当前的系统可用的存储。具体的实现细节跟OS原理本身还不是特别紧密,因此先跳过去。
这里,我删除了里面原来的一个panic,如此软件可以继续想想执行。向下执行所处理的内容是先给kern_pgdir分配1个page的存储空间,然后把分配的空间全都清零。这样,可以想得出来,后续kern_pgdir的内容还是需要进行一定的处理的。不然,后续内核的存储映射也就没了映射机制了。
这里涉及到的boot_alloc是一个半成品,看起来可能得是花一整个晚上来梳理研究的一个接口。这样,我这次的一个内容整理暂且到此告一段落了。这一次最大的收获可能是更加明确了内核的虚拟地址如何映射到物理存储。