Lab 3: User Environments
简介:
本实验中将实现运行受保护的用户态环境(即“进程”)所需的基本内核功能。 将增强JOS内核,以设
置数据结构来跟踪用户环境(进程),创建单个用户环境(进程),将程序映像加载到其中并开始运行。还
将使JOS内核能够处理用户环境(进程)发出的任何系统调用并处理它引起的任何其他异常。
注意:在本实验中,术语“环境”和“过程”是可互换的-两者均指允许您运行程序的抽象。 为了强调
JOS环境和UNIX进程提供不同的接口,并且不提供相同的语义,我们引入术语“环境”而不是传统的术
语“进程”。
预备工作:按课程给出的步骤切换到lab3分支,再将lab2合并
实验要求:与实验2一样,完成实验3中描述的所有常规练习以及至少一个挑战性问题。在lab目录顶层的一个名为Answers-lab3.txt的文件中,写下对实验室中提出的问题的简短答案,写下一两个段落的描述来说明是如何解决挑战性问题的。
Part A: User Environments and Exception Handling
课程中描述了一些管理用户环境(进程)的关键结构体,以及结构体中各元素的含义,值得一提的是在JOS
中,各个环境(进程)不像xv6中的进程那样具有自己的内核堆栈。一次在内核中只能有一个活动的JOS环境(进程),因此JOS只需要一个内核堆栈。
练习1:
修改kern / pmap.c中的mem_init()来分配和映射envs数组,与页面数组一样,应在合适的地方:UENVS(inc / memlayout.h)上以只读方式映射为用户,以便用户进程可以从该数组读取。
要求:运行你的代码,并保证check_kern_pgdir通过。
代码修改很简单,参考Lab2里写过的分配和映射Pages的代码就行了:
补充的代码:
测试居然报错了:
那就调试一下:
调试代码:
调试结果:
可以看到memset之后,kern_pgdir变成0了,搞不清楚,上网查波资料,最后参考了
Salvete