实验完善代码 LAB2-4下载链接 提取码:79t8
1、内核地址空间
JOS 将32位线性地址虚拟空间分为两部分,其中用户环境(用户进程)通常占据低地址部分,叫做用户地址空间;操作系统内核总是占据高位,叫做内核地址空间。这两部分的分界线是定义在memlayout.c 中的一个宏ULIM。JOS 为内核保留了256MB 的虚拟地址空间[0xF0000000,0xFFFFFFFF],这也解释了为什么在LAB1 我们设置的KERNBASE 是0xF0000000,否则的话用户地址空间将不够用。
2、权限及错误隔离
由于内核和用户进程只能访问各自的地址空间,所以我们必须在X86 页表中使用访问权限位来使用户进程的代码只能访问用户地址空间,而不会访问内核地址空间。否则,用户代码的一些错误可能会覆盖内核中的数据,最终导致内核崩溃。
处在用户地址空间中的代码不能访问高于ULIM 的地址空间,但是内核可以读写这部分的地址。需要注意的是,对于地址空间[UTOP, ULIM ] 内核和用户拥有同样的权限:只能读不能写; 这个范围的空间通常被用于将一些只读的内核数据结构暴露给用户。在UTOP之下的地址范围是给用户进程使用的,用户进程可以访问、修改 [0X0, UTOP] 地址空间的内容。
接下来的实验主要是设置UTOP 之上的地址空间:这也就是整个虚拟地址空间中的内核地址空间部分。