OS Lab3 踩坑记

  Lab3在之前Lab2的基础上,增加了进程建立、调度和中断异常处理。其中测试包括进程建立以及进程调度部分。

  由于是第一次做bug记录,而且是调试完bug后再做的记录,所以导致记录不完全。但是为之后bug记录的习惯打下基础。

进程建立测试(env_check)

  注意 env_setup_vm() 中的pgdir地址赋值。

  在 envid2env() 中当有 checkperm 时,检查失败也要给 *penv 赋值 0 (容易忘记)。

  

  这里最好检查一下 curenv 是否存在,负责会造成访问 NULL 导致的循环。判断的时候可以直接比较 env_id 。

进程调度检测

  

  当调用 env_run() 时,如果没有改变 curenv 的 pc 值为 epc,会导致进程再次被调度的时候pc值出错。因此需要显式更改 pc 。

 

  

  注意  load_icode_mapper() 函数中的 i 为 u_long 类型,没法用负值。在我的做法中,我先将 i = -offset , 所以这里出了问题,导致错误。

 

   注意在 sched_yield() 中,在一个进程被调度的时候要清空 counter 值(非常蠢的错误)。还有一个比较重要的地方:注意,如果一个进程还要继续执行的话,要再对他调用 env_run(curenv) 函数,继续执行。