操作系统实验七:保护模式之中断测试实验

本文档详述了操作系统实验中的中断概念,包括中断门、陷阱门和中断向量号的区分,以及如何处理自动和被动产生的中断。实验中涉及8259A可编程中断控制器,介绍了其工作原理,并通过编写代码实现中断描述符表(IDT)和加载中断。实验流程包括切换到保护模式、设置GDT、加载IDT以及进行中断测试。
摘要由CSDN通过智能技术生成

我对中断的理解:

    中断,顾名思义,就是在遇到特殊的情况时,停下当前正在做的事情,转去干其他(根据特殊情况预先设计好的)事情,完成后(并不一定非要)再继续之前做的事情。

   首先说说“去干其他(根据特殊情况预先设计好的)事情”。

   我们可以预先设计好256件事情(处理函数),然后使用0~255这256个编号(中断向量号)表示代指。“事情”根据是否可以再次打断(中断),分为中断门(不可以被打断)和陷阱门(可以再次被打断)。

   下面解释一下所谓的“遇到特殊的情况”,这个特殊的情况按照触发类型可以分为两类:

   自动产生:自动产生的意思就是程序自己根据需要自己主动触发的中断,也就是使用int指令+中断号触发的。对于所有的256个中断,都可以使用int指令触发。   

   被动产生:被动产生,就是系统硬性规定的,在遇到某种指定的情况,就触发对应中断向量号的中断。
具体而言如下表:(摘自《自己动手写内核系列_skelix》天衣有缝,有稍微修改)

中断向量号   触发原因
0x00           除零错
0x01           调试异常
0x02           非可屏蔽中断 (NMI)
0x03           断点 (INT 3 指令)
0x04           溢出 (INTO 指令)
0x05           越界 (BOUND 指令)
0x06           无效的指令
0x07           无协处理器
0x08           双重错误
0x09           协处理器越界
0x0A           无效的 TSS
0x0B           段不存在
0x0C           栈溢出
0x0D           通用保护异常(内存引用或其他检查保护),Windows 9x 蓝屏就是它的杰作
0x0E           页错误
0x0F           Intel 保留
0x10           协处理器错误
0x11-0x19      Intel 保留

需要说明的有两点:
    一.0x11~0x19这12个中断向量号, Intel预定了,但是并没有实际使用上,但将来可能会用到。因此我们可以在编写操作系统的使用直接拿来用,但是这样会有一定风险,要是Intel的下一代产品里使用了这些中断向量号,我们想要兼容它,就不得不修改代码将这几个中断向量号让出来。
    二.上表中触发的原因,基本都是程序运行时发生错误产生的(0x02号中断除外),可以称之为内部中断。与之相对应的称作外部中断的东西,就是由于计算机硬件(键盘,鼠标等)触发的。这些中断是可以屏蔽掉(忽略掉)的。想要响应这些中断,也需要分配相应的中断向量号才行。具体的内容就是下面要讲到的可编程中断控制器8259A。


可编程中断控制器8259A:

8259A分自从两块,每一块都可以接收8个不同触发事件的信号,具体如下:(摘自《自己动手写操作系统》于源)

主 8259A
序号        触发源头
IRQ0        时钟
IRQ1        键盘
IRQ2        来自 从 8259A
IRQ3        串口2
IRQ4        串口1
IRQ5        LPT2
IRQ6        软盘
IRQ7        LPT1

从 8259A
IRQ8        实时时钟
IRQ9        重定向IRQ2
IRQ10       保留
IRQ11       保留
IRQ12       PS/2 鼠标
IRQ13       FPU 异常
IRQ14       AT 温盘
IRQ15       保留

    通过编程,可以指定这些中断事件对应哪些中断向量号、是否使用 从 8259A ,以及屏蔽哪些中断信号。具体的方法请参考pm32.c中的Init8259A()函数。

    了解了中断源(触发源),以及中断源需要的一一对应关系的中断向量号,最后就是对各个中断向量号指定处理的动作(处理函数)了。这个我们在实验任务门的使用已经很熟悉了,就是要创建一个IDT(中断描述符表),这个IDT数组的序号就对应着中断向量号。通过宏Gate中的选择子和偏移量来指定处理的动作(处理函数)。使用lidt系统指令来加载这个IDT。
    需要特别说明的是,IDT这个数组中,每一个元素(中断)占8字节,若定义256个中断的话,需要2048字节的空间,这远远超出了引导扇区512字节的限制,因此与对付上一次实验中的TSS类似,直接使用内存中不会用到的空间。先是定义一个只有一个元素的IDT,然后通过汇编指令重复复制到预先决定好的内存地址,然后再初始化具体的内容(对特定的中断向量指定特定的处理函数)。


此次实验的流程:
    1.跳转到保护模式
    (pm32.c中main函数)
    2.重新加载新的GDT
    3.显示字符串

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值