PA4
目录
思考题
1.灾难性的后果
如果现场信息被保存在0x1000这个地址处,trap frame的信息就会被覆盖,进入中断嵌套,等到结束中断嵌套时由于trap frame的信息会被覆盖掉所以会一直卡在嵌套中断的位置处理中断而不继续运行,影响后续程序运行,严重情况下也可能会使电脑死机
2.必答题
- 分页机制可以给
hello和仙剑奇侠传分配不同的虚拟地址让他们的运行不会相互冲突。 - 因为分页机制的存在所以可以通过中断机制来实现两个程序的分时运行,一开始运行仙剑的虚拟地址,然后时钟来控制中断,保存好现场然后跳转到
hello的虚拟地址处执行 - 以此类推通过来回进程的切换,依靠
shedule函数切换两个程序的执行 - 保存现场是非常重要的一步
实验内容
PA4.1
1.实现内核自陷
在nanos-lite/src/proc.c中进行修改代码
之后修改nexus-am/am/arch/x86-nemu/src/asye.c 文件中的irq_handle 函数加入0x81 也就是自陷的case
之后在-asye-init 函数中的system call 中添加中断情况
之后在trap.S 中添加systrap 的情况
最后修改do_event
利用bin/pal 实现内核自陷
2.实现上下文切换
首先实现_unmake() 函数在文件nexus-am/am/arch/x86-nemu/src/pte.c 中
他的任务就是在·ustack·的底部初始化一个以 entry 为返回地址的陷阱帧。
实现schedule() 函数
之后修改trap.S 中修改陷阱栈帧实现上下文切换
运行结果(新的故事)
3.分时运行仙剑奇侠传和hello程序
在main.c 中添加load_prog("/bin/pal")
之后修改schedule 函数同时运行仙剑奇侠传和hello
PA4.2
1.添加时钟中断
在nemu/include/cpu/reg.h
然后dev_raise_intr()中把INTR 设为真nemu/src/cpu/intr.c
完善trap.S和systemcall
添加
idt[0x20] = GATE(STS_IG32, KSEL(SEG_KCODE), systime, DPL_USER);
之后在do_event 添加即可
实现时钟中断
备注
PA实验到此结束,我们都有光明的未来

浙公网安备 33010602011771号