其他部分:
本实验主要划分为两个部分,第一个部分是进程切换,如果PA3中间理解了系统调用的整个过程,那么这一部分是简单的,切换进程的关键是中断结束之后,会从stack中间恢复上下文环境,如果A进程调用_yield, 恢复的过程使用的是B进程的上下文,那么之后执行就是B进程了。第二部分是地址映射,这一部分需要熟悉理解地址映射的工作原理是什么就可以了。其他都是细节,阅读文档,文档一般会很详细发的告诉你怎么办。
1 可能会遇到问题的地方
1.1 注意当前代码在软件层还是硬件层
vme.c
中间的_map
函数和memory.c
中间的page_translate
分别位于软件层次和硬件层次,两者的操作逻辑很相似,因为前者是填写虚实地址的映射关系,后者使用映射关系。
前者可以随意的使用指针类型装换,但是后者确不可以(Makefile中间的编译选项禁止任何警告), 所以page_translate中间只可以使用paddr_read函数来访问存储空间,并且注意paddr_read的访问是按照byte访问,但是int的数组访问是按照四个byte访问的,很多人发现两者的操作的类似,然后两个函数中间的代码互相对照这写,没有注意到这一个小区别,PDX(va)<< 2
的就是由于byte访问的结构。
paddr_t page_translate(vaddr_t va) {
if (cpu.cr0.paging) {
paddr_t page_dir = cpu.cr3.val;
paddr_t dir_entry_addr = page_dir + (PDX(va) << 2);
PDE page_tab =(PDE)paddr_read(dir_entry_addr, 4);
// ....
1.2 是时候理解一下链接的过程了
未完待续