操作系统——认识认识保护模式(三)中断

时间:2024-03-13 08:32:42

操作系统——认识认识保护模式(三)中断

实验目标:理解中断与异常机制的实现机理

实验内容:

  1. 理解中断与异常的机制
  2. 调试8259A的编程基本例程
  3. 调试时钟中断例程
  4. 建立IDT,实现一个自定义的中断,功能可自定义,如特定键盘组合触发某个动作、电子钟、自己游走的字符显示、蜂鸣器等
  5. 了解IOPL的作用

实验过程:

  1. 理解中断与异常的机制
  2. 调试8259A的编程基本例程
  3. 调试时钟中断例程
  4. 建立IDT,实现一个自定义的中断,功能可自定义,如特定键盘组合触发某个动作、电子钟、自己游走的字符显示、蜂鸣器等
  5. 了解IOPL的作用

实验:

1.什么是中断,什么是异常

中断是CPU暂停当前工作,有计划地去处理其他的事情。中断的发生一般是可以预知的,处理的过程也是事先制定好的。处理中断时程序是正常运行的。
而异常是CPU遇到了无法响应的工作,而后进入一种非正常状态。异常的出现表明程序有缺陷。
实际上,它们都是程序执行过程中的强制性转移,转移到相应的处理程序。

2.8259A的工作原理是怎样的?

操作系统——认识认识保护模式(三)中断
8259A结构如上图。
通过初始化编程向8259A写入相应的初始化命令ICW,可以使芯片处于一个规定的基本工作方式,并在此方式下进行工作。8259A的初始化命令字共有4个ICW1-ICW4,进行初始化时要求ICW1-ICW4按一定的顺序写入。
操作系统——认识认识保护模式(三)中断

首先,一个外部中断请求信号通过中断请求线IRQ,传输到IMR(中断屏蔽寄存器),IMR根据所设定的中断屏蔽字(OCW1),决定是将其丢弃还是接受。
操作系统——认识认识保护模式(三)中断
如果可以接受,则8259A将IRR(中断请求暂存寄存器)中代表此IRQ的位置位,以表示此IRQ有中断请求信号,并同时向CPU的INTR(中断请求) 管脚发送一个信号,但CPU这时可能正在执行一条指令,因此CPU不会立即响应,而当这CPU正忙着执行某条指令时,还有可能有其余的IRQ线送来中断请求,这些请求都会接受IMR的挑选,如果没有被屏蔽,那么这些请求也会被放到IRR中,也即IRR中代表它们的IRQ的相应位会被置1。
当CPU执行完一条指令时后,会检查一下INTR管脚是否有信号,如果发现有信号,就会转到中断服务,此时,CPU会立即向8259A芯片的INTA(中断应答)管脚发送一个信号。当芯片收到此信号后,判优部件开始工作,它在IRR中,挑选优先级最高的中断,将中断请求送到ISR(中断服务寄存器),也即将ISR中代表此IRQ的位置位,并将IRR中相应位置零,表明此中断正在接受CPU的处理。同时,将它的编号写入中断向量寄存器IVR的低三位(IVR正是由ICW2所指定的,不知你是否还记得ICW2的最低三位在指定时都是0,而在这里,它们被利用了!)这时,CPU还会送来第二个INTA信号,当收到此信号后,芯片将IVR中的内容,也就是此中断的中断号送上通向CPU的数据线。

3.如何建立IDT,如何实现一个自定义的中断

1)将idt放入一个单独的段中
操作系统——认识认识保护模式(三)中断
定义了idt所对应的中断向量的偏移,即为图中红色框圈出的部分。

2)定义偏移定义
操作系统——认识认识保护模式(三)中断
操作系统——认识认识保护模式(三)中断
分别对应上图两个中断处理程序。其功能为在时钟中断到来时,将[gs:((80 * 0 + 70)*2]位置的字符串值增1,并以其字符串所对应的值作为行数,将新获得的字符串打印到对应行。

3)调用中断,开中断
操作系统——认识认识保护模式(三)中断

结果如下:
可能是寄存器操作的时候出现失误,不小心更改了背景颜色和字符串颜色,但其打印过程是根据时钟进行的,可见时钟中断调用是顺利的。
操作系统——认识认识保护模式(三)中断

4.如何控制时钟中断

核心思路就是在idt表中,将中断向量号单独写出来,对应一个中断处理的函数,在函数里定义时钟中断的处理过程:
操作系统——认识认识保护模式(三)中断

中断处理程序:
操作系统——认识认识保护模式(三)中断
中断处理程序并不仅仅只有一个,用户可以自定义多个程序。在遇到不同中断向量号的时候使用不同的中断处理方式可以提高CPU处理效率。

5.IOPL的作用与基本机理

(1)IOPL的作用:
操作系统——认识认识保护模式(三)中断
保护模式通过IOPL和I/O许可位图来限制用户进程进行的I/O操作。IOPL是I/O保护机制的关键之一,位于寄存器eflags的第12、13位。指令in、ins、out、outs、cli、sti只有在CPL <= IOPL时才能执行。这些指令被称为I/O敏感指令(I/O Sensitive Instructions)。如果低特权级的指令试图访问这些I/O敏感指令将会导致常规保护错误(#GP)。
(2)IOPL的运行机理:
I/O位图基址是一个以TSS的地址为基址的偏移,指向的便是I/O许可位图。之所以叫做位图,是因为它的每一位表示一个字节的端口地址是否可用。如果某一位为0,则表示此位对应的端口号可用,为1则不可用。由于每一个任务都可以有单独的TSS,所以每一个任务可以有它单独的I/O许可位图。
比如,有一个任务的TSS是这样的:
操作系统——认识认识保护模式(三)中断
由于I/O许可位图开始有12字节内容为0FFh,即有12×8=96位被置为1,所以从端口00h到5Fh共96个端口地址对此任务不可用。
同理,接下来的1字节只有第1位(从0开始数)是0,表示这一位对应的端口(61h)可用。
如果I/O位图基址大于或等于TSS段界限,就表示没有I/O许可位图,如果CPLIOPL,则所有I/O指令都会引起异常。I/O许可位
图的使用使得即便在同一特权级下不同的任务也可以有不同的I/O访问权限。