PA4

目录

思考题

1.灾难性的后果

如果现场信息被保存在0x1000这个地址处,trap frame的信息就会被覆盖,进入中断嵌套,等到结束中断嵌套时由于trap frame的信息会被覆盖掉所以会一直卡在嵌套中断的位置处理中断而不继续运行,影响后续程序运行,严重情况下也可能会使电脑死机

2.必答题

  1. 分页机制可以给hello 和仙剑奇侠传分配不同的虚拟地址让他们的运行不会相互冲突。
  2. 因为分页机制的存在所以可以通过中断机制来实现两个程序的分时运行,一开始运行仙剑的虚拟地址,然后时钟来控制中断,保存好现场然后跳转到hello 的虚拟地址处执行
  3. 以此类推通过来回进程的切换,依靠shedule 函数切换两个程序的执行
  4. 保存现场是非常重要的一步

实验内容

PA4.1

1.实现内核自陷

nanos-lite/src/proc.c中进行修改代码

image-20210706165138581

之后修改nexus-am/am/arch/x86-nemu/src/asye.c 文件中的irq_handle 函数加入0x81 也就是自陷的case

image-20210706170118493

之后在-asye-init 函数中的system call 中添加中断情况

image-20210706171035971

之后在trap.S 中添加systrap 的情况

image-20210706171728327

最后修改do_event

image-20210706171954098

利用bin/pal 实现内核自陷

image-20210706172753819

2.实现上下文切换

首先实现_unmake() 函数在文件nexus-am/am/arch/x86-nemu/src/pte.c

他的任务就是在·ustack·的底部初始化一个以 entry 为返回地址的陷阱帧。

image-20210706173446040

实现schedule() 函数

image-20210706173902893

之后修改trap.S 中修改陷阱栈帧实现上下文切换

image-20210706174349603

运行结果(新的故事)

image-20210623191324151

3.分时运行仙剑奇侠传和hello程序

main.c 中添加load_prog("/bin/pal")

image-20210706194204482

之后修改schedule 函数同时运行仙剑奇侠传和hello

image-20210706194135729

PA4.2

1.添加时钟中断

nemu/include/cpu/reg.h

image-20210706192601271

然后dev_raise_intr()中把INTR 设为真nemu/src/cpu/intr.c

image-20210706194457371

完善trap.Ssystemcall

添加

idt[0x20] = GATE(STS_IG32, KSEL(SEG_KCODE), systime, DPL_USER);

之后在do_event 添加即可

image-20210706195134354

实现时钟中断

image-20210706193627436

备注

PA实验到此结束,我们都有光明的未来

posted @ 2021-08-05 10:37  shangjin2001  阅读(878)  评论(0)    收藏  举报