Lab2-Part3:Kernel Address Space
Part 3: Kernel Address Space
我们用qemu模拟器模拟了运行JOS所需的硬件,这个硬件的cpu拥有32位的地址总线,也就是说JOS的虚拟空间最大可以为为2^32,即4G(4294967296)。
JOS 将 4G 的线性(虚拟)地址空间划分为两个部分。用户使用低地址的部分,内核使用高地址的部分。这两者划分的界限是inc/memlayout.h中的ULIM这个宏,为内核保留了大约256MB左右的虚拟地址空间。(之所以这里说的是大约,是因为还有一部分是内核的栈,还有一个Memory-mapped I/O,这一块估计是给IO用的)。这也就是解释了在lab1中提到的,为什么内核占据了虚拟地址的高地址部分,因为我们要留给user process足够的空间。
在inc/memlayou.h当中有虚拟内存的示意图:memlayout.h
但是有点难懂,简书的扶桑与克里斯大佬做了一个补充图:

几个关键的位置用红色标出来了,UTOP下面的没画。
Permissions and Fault Isolation
权限和故障隔离
每个进程可以拥有不同的环境(我的理解:环境的不同其实就是寄存器和堆栈的不同)
内核kernel和用户内存存在于每个环境的地址空间中,为了防止用户进程访问并修改内核,我们必须在x86页表中使用权限位来允许用户代码只访问地址空间的用户部分
对于大于ULIM的地址,用户程序不能对这块内存执行任何操作,读写都不行,内核对这一块内存可读可写。对于内存从UTOP-ULIM,这一块内存对于kernel和user是read-only的,不能修改。低于UTOP的地址是给用户进程用的
Initializing the Kernel Address Space
我们要根据 inc/memlayout.h 中的虚拟内存布局(也就是上图)来设置UTOP以上的地址空间。
也就是Exercise 5 中的内容,
在Lab2-exercise1 中 我们为pages数组分配了内存并使用pages代表物理内存来管理物理内存,
在Lab2-exercise4 中我们实现了用于管理页目录、页表和pages关系(也就是虚拟内存和物理内存的关系)的几个函数。
在接下来的练习,也就是Lab2-exercise5中,我们将使用 exercise4 中的那几个函数来实现具体物理地址和具体虚拟地址之间的映射。

浙公网安备 33010602011771号