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实验!!!