保护模式汇编系列之二 - 中断和异常处理

如果你对中断是什么都不清楚的话,还是先Google一下中断的定义和基本概念吧,这里给出一个链接: http://zh.wikipedia.org/zh/%E4%B8%AD%E6%96%B7

好了,看完了这个链接,我想你已经大致明白了什么是中断,还有中断的作用了吧?我们再来总结下,其实简单说中断就是一种通知机制罢了。我们知道操作系统的一个核心任务就是和连接在主板上的所有的硬件设备进行通信,但是CPU和这些外设的速率根本就不在一个数量级上,倘若CPU向某一个设备发出一个请求并且一直等待反馈结果的话,这样带来的性能损失是不可接受的。而且CPU在运行期间需要得知外设所发生的事件,轮询显然是不可取的,那么就迫切需要一种机制来帮助我们解决这个问题。

肩负着这一伟大使命,中断应运而生。当中断发生时,典型的处理方式就是打断CPU目前正在做的事情,CPU会保留当前的执行现场,转移到该中断事先安排好的中断处理函数去执行,执行结束之后再回来恢复之前的执行现场去执行。

从物理学的角度看,中断其实就是一种电信号,一般由硬件设备生成并送入中断控制器统一协调(当然需要一个“协调机构”了,试想所有设备不区分轻重缓急的和CPU发送中断信号的恐怖场景…)。中断控制器就是个简单的电子芯片,其作用就是将汇集的多路中断管线,采用复用技术只通过一条中断线和CPU相连接。既然中断控制器这里只有一条线和CPU相链接,那么为了区分各个设备,中断自然就有编号了。

补充一下,其实CPU的中断管脚并非只有一根,其实是有NMI和INTR两个管脚,因为从严重性上来看,中断是分为两类的,首先NMI管脚触发的中断是需要无条件立即处理的,这种类型的中断是不会被阻塞和屏蔽的,所以叫做非屏蔽中断(Non Maskable Interrupt, NMI)。事实上一旦产生了NMI中断,就意味着CPU遇到了不可挽回的错误,一般不会进行处理,只是给出一个错误信息。而我们之前所说的中断控制器连接的管脚叫做INTR,这类中断有两个特点,分别是数量多和可屏蔽。而我们主要关注的正是INTR中断。

我举一个通俗的例子,假设你就是CPU,你正在看书(执行任务),突然间你的鼻涕流下来了(一个NMI中断),这个自然是不可以屏蔽的,不然会流到嘴里的…(好恶心),你现在把书反着扣在桌子上避免找不到页码(保留当前执行现场),取出纸巾…(此处省略几十个字),OK,你处理完后把书拿起来继续看(恢复之前的执行现场)。这就是一个中断的处理过程,其实很简单是不是?这是不可屏蔽中断,那么可屏蔽的呢?还是刚刚那个场景,你在看书,手机响了(一个INTR中断),但是你在学习期间不想被打扰,就无视它了…这就是可屏蔽中断了。

通俗的例子举完了,我们还是专业一点好了。在x86PC中,我们熟知的中断控制芯片就是8259了,它就是我们说的中断控制器了。Intel的处理器允许256个中断,中断号范围是0~255。8259芯片负责15个,但是并不固定中断号,允许通过IO端口设置以避免冲突。所以,它的全称是可编程中断控制器(Programmable Interrupt Controller,PIC)。关于8259的资料网上铺天盖地的,至于8259的结构,如何屏蔽中断什么的我就不多说了,请读者自行了解。

其实从上面的描述中我们基本上能理解中断的概念了。再简单说就是硬件发生了某个事件后告诉中断控制器,中断控制器汇报给CPU,CPU从中断控制器处得知了中断号,根据这个中断号找到对应的中断处理程序并转移过去执行,完成后重新回到之前的执行流程去。

至于实模式下的中断处理,我简单说下吧。既然Intel支持256个中断,理论上就需要256段对应的中断处理程序了,至于它们放在哪里并不重要,重要的是如何找到入口。实模式下很简单,实模式下一个地址由段地址+偏移地址构成,一个函数入口地址正好就是4字节,256个函数的地址数组就是1KB了。CPU要求直接把中断处理函数的地址从0~255按顺序放置在物理内存地址的0x00000~0x003ff,占据了内存最前面的1KB。就这么简单,CPU可以简单的通过一个中断号码乘以4找到相应的处理函数的地址并执行了。

我们之前一直说的都是硬件中断,其实除了硬件中断之外还有软件中断,也就是软件系统也可以利用中断机制来完成一些任务,比如有些OS的系统调用的实现就采用了中断的方式。

我们的重点是保护模式下的中断处理。中断处理程序是运行在ring0层的,这就意味着中断处理程序拥有着系统的全部权限,那么我们就不能简单的像实模式下类似函数指针数组这样的方式了。仿照内存段描述符表的思路,Intel设置了一个叫做中断描述符表(IDT, Interrupt Descriptor Table)的东西,和段描述符表一样放置在主存中,类似地,也有一个中断描述符表寄存器(IDTR)记录这个表的起始地址。我们给出一张IA32平台上的中断编号的定义表。

这是0号到19号中断,20~31号中断Intel保留了,32~255号中断留给了用户去定义和使用。在Linux系统下我们可以查阅当前的中断定义和映射表,方法是查看/proc/interrupts 文件即可,如图所示:

至于保护模式下的中断描述符的结构,分类等等细节问题,我就不多说了。本文的定位就是对中断概念的科普,写到这里也算是完成使命了。接下来怎么继续研究呢?我推荐Intel的CPU开发第三卷的中断章节,《深入理解计算机系统》第8章—异常控制流,《x86汇编—实模式到保护模式》最后一章供大家参考。

相信有了本文的简单介绍,对大家研究上面基本书的相关章节会有所帮助。而且你会发现本文为了通俗易懂,简化了很多的东西,甚至有的地方严格说是有问题的。不管怎么样,本文权当抛砖引玉,路还很长,我们一起走吧。

时间: 2024-08-29 07:00:33

保护模式汇编系列之二 - 中断和异常处理的相关文章

保护模式汇编系列之一 - 初探保护模式

为了后面学习操作系统的需要,从今天开始我要研究x86的汇编了.所以我决定开始总结并连载x86的汇编系列,这是第一篇--初探保护模式. 我假定读者接触过16位的汇编语言,并理解汇编语言的基本概念.熟悉8086处理器采用的"段寄存器 * 16 + 偏移地址"的寻址方法. 我们从80386处理器入手.首先,到了80386时代,CPU有了三种运行模式,即实模式.保护模式和虚拟8086模式. 实模式指的是8086CPU的运行模式,不过这是后来提出的概念,在8086时代只有当时的运行模式,自然也就

深入理解计算机系统-之-内存寻址(二)--存储保护机制(CPU实模式与保护模式)

cpu的保护模式由来 分段机制 8086的诞生,标志着Intel 正式进入了x86时代,这是个多么具有纪念意义的日子:1978-6-8.同时,8086的诞生也是处理器内存寻址技术的第一次飞跃. 对于一根实际的.实实在在的.物理的.可看得见.摸得着的内存条而言,处理器把它当做8位一个字节的序列来管理和存取,每一个内存字节都有一个对应的地址,我们叫它物理地址,用地址可以表示的长度叫做寻址空间.而CPU是如何去访问内存单元里的数据的方式就叫做寻址. 8086得CPU在内存寻址方面第一次引入了一个非常重

汇编-在保护模式的无特权级变换的转移

问题描述 在保护模式的无特权级变换的转移 在保护模式下采用 JMP 和 RETF 指令进行任务内无特权级变换的转移.最好是能给出程序和说明,而不是到处引用,新手勿扰. 解决方案 用 JUMP.CALL.RETF等指令进行相应段的转移.在用到 CALL 指令时,使用堆栈,以使得在调用 CALL时,系统对 CALL 当前的程序运行点进行压栈保存,在遇到 RETF 返回指令时,进行弹栈返回. 解决方案二: (1)实模式下的初始化,包括对GDT和演示任务LDT的初始化,装载GDTR:(2)从实模式切换到

操作系统-保护模式下的中断的问题:关于硬件的中断对应的是哪个中断向量?

问题描述 保护模式下的中断的问题:关于硬件的中断对应的是哪个中断向量? 就是硬件产生中断时,向8259a产生中断信号,然后8259a向CPU发出中断信息,并产生相应的中断向量,然后cpu可以从中读取该中断向量,然后调用相应的中断处理程序,这个调用是在中断描述符表中根据根据 中断向量 * 8 的偏移地址来. 假如上面说法正确(不知道自己理解对不对),那么硬件对应的中断向量是不是固定的? 因为我看到书上的 实时时钟中断 它就是直接对应的是0x70的中断向量(没有设置,中断描述符直接放置在IDT中0x

三星F591系列显示器如何开启眼睛保护模式?

1.按显示器背面的[电源]键.(以下[电源]键操作,均指此按键.)       2.屏幕右下方会出现5个小图标.        3.按照下图箭头所示方向拨动.       4.把光标移动到眼睛保护模式的位置.        5.按[电源]键.        6.屏幕提示眼睛保护模式:开.       温馨提示: 1.此功能开启后,显示器亮度.灵视竞技.灵巧模式.色彩以及ECO节能增强功能菜单呈灰色不可用.

三星F359系列显示器如何关闭眼睛保护模式?

1.按显示器背面的[电源]键.(以下[电源]键操作,均指此按键.)       2.屏幕右下方会出现5个小图标.        3.按照下图箭头所示方向拨动.       4.把光标移动到眼睛保护模式的位置.        5.按[电源]键.        6.屏幕提示眼睛保护模式:关.    

探索Oracle11gR2 之 DataGuard_03 三种保护模式

探索Oracle11gR2 之  DataGuard_03   三种保护模式 作者:吴伟龙 Oracle的DataGuard技术有三种实现模式,分别是max performance.max availability.maxprotection这三种模式. 以下是来自Oracle文档的摘要信息: In some situations, a business cannot afford to lose data. In other situations,the availability of the

【DG】DG的3种保护模式

[DG]DG的3种保护模式 DG提供了3种数据保护模式:最大保护(Maximum Protection).最高性能(Maximum Performance)和最高可用(Maximum Availability),如下表所示: 表 3-32 DG三种模式的区别 数据库异地备份方案 在对数据库计划实施异地备份时,需要理解异地备份的目的.一般情况下有两种异地备份的需求:一是确保业务的实时以及最大程度减少由于单点故障导致业务中断:二是确保数据的安全,当生产节点出现物理故障时能通过异地备份及时的恢复数据.

如何实现Oracle DG最大保护模式

实现最大保护模式,可以先实现最大性能模式,然后再转换为最大保护模式. 一.三种保护模式 最大性能(maximize performance):这是data guard默认的保护模式.primay上的事务commit前不需要从standby上收到反馈信息,该模式在primary故障时可能丢失数据,但standby对primary的性能影响最小. 最大可用(maximize availability):在正常情况下,最大可用模式和最大保护模式一样:在standby不可用时,最大可用模式会自动降低成最