Skip to content

pa4-1

题目

1.注册监听键盘事件是怎么完成的?
  • 首先在echo.c文件中调用add_irq_handler(1, keyboard_event_handler);
  • add_irq_handler函数中准备寄存器参数并通过陷阱指令int0x80进行系统调用,转移到raise_intr进行处理
  • 根据寄存器中的调用号(0)raise_intr会调用相对应的处理函数,而该处理函数的作用就是注册irq处理函数,即将1号中断注册到键盘事件处理函数keyboard_event_handler,至此完成键盘事件的注册
2.从键盘按下一个键到控制台输出对应的字符,系统的执行过程是什么?如果涉及与之前报告重复的内容,简单引用之前的内容即可。
  • keyboard_down函数会在键盘某个按键按下时触发,并通过i8259_raise_intr(KEYBOARD_IRQ)登记中断,设置中断号并将cpu.intr置为1,即有中断等待cpu处理
  • 在执行下一条指令前cpu会先通过do_intr进行检查,发现中断并通过raise_intr(intr_no)进行处理,之后会通过idt表查找对应的异常处理函数(这个异常处理函数就是上面所注册的函数)进行处理
  • 具体的处理过程为:从键盘io端口通过in指令逐步读入数据,然后再通过out指令输出到终端,实现输入的获取和输出。

实验总结

  • 这一阶段需要完成的任务不算多,无奈前面pa2、3埋下太多的坑,花费了无数时间去debug。并且可能由于使用vpn的原因并没有成功实现x11转发,因此有一些测试没有成功进行(比如显存测试就非常奇怪)
  • 经历漫长的一学期后pa终于结束了,有点可惜的是前面写的代码实在太烂,错误百出,在pa4中遇到了太多问题,最终也没有完成pa4-3.总的来说非常感谢老师为这门课带来了十分精彩的pa实验!!!