全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
继续学习JOS的存储管理,这一次看一部分初始化的相关内容吧!估计一晚上的时间也就只能够看一部分,预感这部分会有一点复杂度。
先看这个定义,这地址前面理解页目录以及页表等概念的时候已经简单接触过了。这个是内核空间开始的地址,同时也用做了内核stack的栈顶地址。
这个结合这个memory的分布来看的话,其实能够看得出来。操作系统其实是被链接到了KERNBASE + 1MB的地址上的,也就是说从画出来的这部分继续向上的一部分空间中。而堆栈在这个架构上是向下增长的,因此,如果堆栈设置在这里的话并不会破坏操作系统内核的数据。
中间跳过去的这部分参数其实很好理解了,在x86的设计中,最开始的一块地址是存储,一共640K。但是,继续往后有384K的存储空洞,这部分地址空间是给IO外设留下来的。如果按照之前看到的OS的分页映射,这部分的线性地址其实是在KERNBASE开始的1MB范围之内。而EXTPHYSMEM被定义为了1MB,因此上面的注释中会说这个存储的空洞会结束于KERNBASE + IOPHYSMEM。
这里又回到了最开始看的信息,KSTACKTOP已经是知道了,这个是内核的堆栈栈顶地址。下面两个参数分别为内核堆栈的大小以及内核堆栈警戒区。
从这个存储分布图可以看出来,这个内核的警戒区其实就是一段无效的存储。但是,看到这里我多少开始有点疑问了。因为,我们的JOS在初始化的时候映射的存储只有两部分,第一个是0~4MB映射到0~4MB。另外一部分就是前面提到的:[KERNBASE, KERNBASE+4MB) 映射到物理地址区间[0, 4MB)。但是,这两个地址区间都没有包含以上地址区间段。那么,上面的这一一部分内核堆栈后续应该如何处理呢?
再看这两个定义,这两个定义非常容易理解。其实,就是从KERNBASE开始向下,先划掉了4MB的空间用来取出一部分作为内核的堆栈区域。之后,再往下来4MB就划出来了这个区域。而这个区域,从现在的字面上看应该是为了处理IO映射用的。
从内核开始,划出去一个内核堆栈空间,再划出去一个IO映射空间。继续往下,就是用户空间了。用户空间还有一些细致的划分,但是这个地址的极限值在这里限制住了。
继续往下,首先这里的这注释我觉得如果能够放到前面去的话会给我一些帮助。其实,这部分注释的内容也就是我前面推测、猜测出来的内容。但是,这部分内容更加细致,除了说明用户的存储空间可用范围之外,还指出来了这里还有一些特殊的用户只读的信息区域。这几个区域大小都是4MB,看起来都会对应一个页目录条目。这几条信息分别为:虚拟页表、页结构、env(环境?)结构。
整个信息的整理理解花了一些时间,今晚上看得进度不算快。其实,还是有冲动想把这部分的定义信息全都看完的,但是继续看下去身体怕是又得大幅度透支了。暂且到此吧!