PA 4 中断、异常与IO

PA 4-1 异常和中断的响应

内部异常与外部中断被视为异常的控制流,内部异常包括故障(缺页、非法操作码、除数为0等)、陷阱(用户程序主动调用操作系统处理例程)、终止(执行指令时发生严重错误,如内存校验错误);外部中断:典型地由I/O设备触发,与当前正在执行的指令无关的异步事件

操作系统先准备好IDT(中断描述符表),规定了出现\(n\)号异常时,去执行从\(IDT_n\)开始的处理程序,处理完后回到原程序继续。

基本步骤:

(1)检测到异常或中断,得到异常、中断号,内部异常设为0x80,外部中断由中断控制器(i8259提供)

(2)保护当前程序执行状态,依次将EFLAGS、CS、EIP(断点)寄存器的值压栈

(3)使用异常、中断号查表,得到处理程序入口地址,地主存储在idtr寄存器中,由lidt指令负责装入

(4)转到OS提供的处理程序继续执行

(5)结束后iret恢复程序执行zhuangtai

(6)回到断点继续执行源程序

pusha 将各通用寄存器的值压栈(保护现场)

popa 将各通用寄存器的值弹栈(恢复现场)

PA 4-2 外设与I/O

为计算机接上眼睛和嘴巴,完成实现一台现代计算机的“最后的拼图”。

CPU完成与外设通信(进行输入输出)的方式

(1)端口映射I/O(port-mapped I/O)

串口(Serial),键盘(Keyboard),硬盘(IDE)(成块进行数据交换)

将外设的数据、状态、控制寄存器称为I/O端口;对端口进行编号;CPU使用in与out指令同端口间通过按编号“打电话”的方式通信

假设有65536个I/O端口,由16位无符号整型编码,可以做如下分配:键盘分配0x60端口,硬盘分配0x1F00x1F7端口,串口分配0x3F80x3FF端口,可通过如下指令进行端口(0x3F8)输出:

1
2
3
movb $A, %al
movw $0x3F8, %dx
outb %al, %dx

PA 4-2 任务一

完成串口的模拟,实现in与out指令以及实现serial_printc()函数。运行hello-inline测试用例,对比实现串口前后的输出内容的区别。

PA 4-2 任务二

改造loader函数(第三次修改【PA 2-2】【PA 3-3】),

PA 4-2 任务三

通过echo测试用例,

(2)内存映射I/O (Memory Mapped I/O)

显卡(VGA)

声卡(Audio),时钟(Timer)只产生时钟中断【PA 4-1】