南京大学 计算机系统基础 课程实验 2018(PA4)

其他部分:

  1. PA0-1
  2. PA2
  3. PA3

本实验主要划分为两个部分,第一个部分是进程切换,如果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 是时候理解一下链接的过程了

未完待续

你可能感兴趣的:(南京大学 计算机系统基础 课程实验 2018(PA4))