Mengzelev's Blog

PA4实验报告

Word count: 972 / Reading time: 3 min
2018/12/28 Share

实验进度

我已完成全部实验内容。

2018/12/15:
完成PA4.1。不少自认为关键的地方竟然怎么改都是对的,有点慌

2018/12/16:
PA4.2第一个任务完成,再不开始做数电大实验就要死了,只能封印PA

2018/12/23:
被数电大实验折磨完,PA4.2完成。仙剑跑得慢到感人。

2018/12/24:
平安夜,发现4.2最后一个task忘了跑了,定位了半天bug发现是context_kload忘了改成context_uload,心情简单。开始做4.3,但是由于前几天睡眠不足连着写了好几个沙雕bug,于是决定先放弃。

2018/12/25:
圣诞节,继续写PA4.3,花了一个小时解决了平安夜昏睡状态下写出的沙雕bug,花了4个小时解决了当天写出的沙雕bug,也就是PA最后一个bug。PA通关!

蓝框思考题

迫于作业和复习考试压力,这次也一道都没做……

我遇到的bug

  • 没看到讲义上要求把loader把文件映射到物理页的要求,映射到虚拟页上,结果一直出发pte.present==0的assert。仔细一想loader的确有义务把程序搬到合适的实际位置
  • 即使是一个简单的dummy程序,其内容也有两页多。而且不能直接用文件大小/PGSIZE,否则余数部分会被丢弃
  • make run的时候可能会碰到一大堆链接报错,原因不明,目前解决方案是在所有目录下都来一遍clean(-update)-run全家桶。这时候调试公理1是不是被打破了呢?
  • _switch是用来切换到下一个进程的,因此传入参数肯定为next而非tf【这不是我遇到的bug,是我不少同学都遇到的bug,所以也记下来了
  • 增加时钟中断时需要填写idt表,太久没碰系统调用这个都忘了
  • 4.3最后测试进程切换的时候千万不要因为嫌仙剑跑得太慢换成bmptest,这玩意儿是根本block了events_read()的,导致我debug了4个小时才发现

实验中的发现

  • cr3cr0有关的指令的译码函数其实可以使用框架代码提供的现成的译码函数,只不过需要研究一下怎么使用
  • 在写_map函数时,我思考了很久,为什么当页目录的present位无效时,要用回调函数申请一个新的物理页。觉得应该是把这一页作为了存放页表的物理页
  • 一些头文件里有不少讲义没提到的、可以方便coding的宏定义,例如x86.hmmu.h,论RTFSC的重要性

实验心得

  • 一定要好好读讲义
  • 和同学交流了一下,发现不一定要全部理解了再开始写代码。可以把框架代码中提供的东西输出一下,根据输出的值来猜测这个变量的含义,或者这个函数的功能。做实验和理解理论是相辅相成的
  • 每次开机,看着一行行初始化Log,就会想到这只是一个比我刚刚造完的(其实大部分都是yzh写的)的东西复杂一点(这个一点有点多)的家伙,就觉得五味杂陈
  • 迫于时间压力不少挑战极限的选做题都没做
  • 这学期做PA还是依赖了不少人的帮助,寒假想要二周目并完成PA5,希望也能把不少选做题都做一下

Acknowledgements

  • 感谢某人提供的探路和盯着写bug服务
  • 感谢不水的正经学习群的群友们互帮互助的debug氛围

本实验报告同样会将去掉必答题的版本同步上传至个人blog

CATALOG
  1. 1. 实验进度
  2. 2. 蓝框思考题
  3. 3. 我遇到的bug
  4. 4. 实验中的发现
  5. 5. 实验心得
  • Acknowledgements