1658_MIT 6.828 JOS memmap以及一些存储划分定义的解读-第二部分

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

         之前,花了一晚上时间一个头文件只看了一大半。虽然看出来了一点头绪,但是考虑身体为本的原则还是暂停了。这一次继续之前的工作,把memlayout.h这个文件中剩余的信息看完。

1658_MIT 6.828 JOS memmap以及一些存储划分定义的解读-第二部分_第1张图片

         之前,看到的UENVS的信息,这个地址是用户的只读区域的边界线了。继续往下的存储,一系列更低地址的存储空就是用户使用的主要区域了。这部分存储不仅可以读取,而且可以允许进行写操作。

         在用户可以完全操作的存储空间中,最上面先进行了 exception 的处理存储区域的划分,这个存储区域一共是2页 8K,实际的使用使用了4K,另外的一半处理机制跟上一次看到的内核的堆栈类似,加了一个无效数据区域作为防护区。

1658_MIT 6.828 JOS memmap以及一些存储划分定义的解读-第二部分_第2张图片

         之后,大片的地址分配区域就是直接作为用户自由使用的区域了。接下来的几个特殊区域是两个区。其中一个包含2部分:一个是临时交换区,另一个是页错误的处理区。第二个大区则是USTABDATA的存储区域。这两个大区占用了前面的8MB空间。因此,真正的JOS的程序是从8MB的地址之后开始使用的。第一个4MB之中包含了USTABDATA,其实是从2MB的位置开始的,这只用掉了这一个大区中的一部分。而第二个区域中,错误处理其实用掉的空间比较小,只有一个页,4K,其他的全都是交换区应用。

1658_MIT 6.828 JOS memmap以及一些存储划分定义的解读-第二部分_第3张图片

         通过这个文本图示,能够看得出来这个存储划分的效果。

1658_MIT 6.828 JOS memmap以及一些存储划分定义的解读-第二部分_第4张图片

         光看内核这部分,其实这个是暂时不需要关注的。

1658_MIT 6.828 JOS memmap以及一些存储划分定义的解读-第二部分_第5张图片

         这个宏定义在makefile中是定义了的,但是是在用户C编译选项的处理中。

1658_MIT 6.828 JOS memmap以及一些存储划分定义的解读-第二部分_第6张图片

         从现在的内核工程看,这个编译选项暂时是没有用到的。

1658_MIT 6.828 JOS memmap以及一些存储划分定义的解读-第二部分_第7张图片

         最后的这个page信息数据结构,最主要的一个功能现在看上去是为了实现页面到物理地址的映射管理。而且,当前的实现中已经有一个接口page2pa()可以实现page到物理地址的转换了。

         这样,整个memlayout.h文件基本大概看了一遍了。从这里面还是学到了一些存储分布以及使用的一个基本概念的。后续,如果着手做存储管理的处理,或许能够更顺利一些了。

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