IA-32 架构下异常和中断的处理

前言:上一次我们说了说,异常和中断是什么,现在我们说说IA-32 架构下异常和中断的处理

还记得这个图吗?

异常和中断的处理方式很像,都是进入内核态。所以两者的处理方式很相同。在 IA-32 架构下有 256 种不同的异常和中断。

每个异常和中断都有唯一编号,称之为中断类型号,如类型号 0,是除法除以 0。而且,每一个异常和中断都有其对应的异常处理程序和中断服务程序,其入口地址放在一个专门的「中断向量表」或者「中断描述符」中

前 32 个类型(0~31)留给 CPU,剩下的(32~255)由操作系统定义。

通过 int n(31 < n < 256),使 CPU 自动转到 OS 给出的中断服务程序执行

一共有两种不同的表:「中断向量表」和「中断描述符」,原因是,我们从开机到由操作系统接管机器经历了两种模式:

实地址模式-------->保护模式

在实模式中存储中断程序入口表的叫做:「中断向量表」,而在保护模式存储中断程序入口表的叫做:「中断描述符表」

现在分别来介绍两种表:

实地址模式:中断向量表

我们知道:在实地址模式下通过 cs(16 位) ip(16 位) 来确定地址(cs << 4 + ip)。寻址空间只有 1M(20 位)。

中断向量表位于 0000H~03FFH。共 256 组,每组占四个字节 CS:IP 。

(就像这样)

是谁!让我的机器有了「中断向量表」

都是 BIOS!!!

BIOS 干了啥?

  • 开机后系统首先在实地址模式下工作(只有 1MB 寻址空间)
  • 开机过程中 BIOS 在实地址模式下准备「中断向量表」和「中断服务程序」
  • BIOS 程序检查显卡,键盘和内存等等,并在 00000H~003FFH 区建立中断向量表,并在主存中准备了中断服务程序
  • BIOS 利用 INT 指令执行特定的中断服务程序把OS从磁盘加载到内存中。例如,BIOS 可通过执行 int 0x19 指令来调用中断向量 0x19 对应的中断服务程序,将启动盘上的 0 号磁头对应盘面的 0 磁道 1 扇区中的引导程序装入内存
  • BIOS(Basic Input/Output System)是基本输入/输出系统的简称,是针对具体主板设计的,与安装的操作系统无关
  • BIOS 包含各种基本设备驱动程序,通过执行 BIOS 程序,基本设备驱动程序以中断服务程序的形式被加载到内存,以提供基本 I/O 系统调用
  • 一旦进入保护模式,就不再使用BIOS

保护模式:中断描述符表

保护模式下,通过「中断描述符表」获异常处理或中断服务程序入口地址。

中断描述符表 (Interrupt Descriptor Table,IDT)是 OS 内核中的一个表,共有 256 个表项,每个表项占 8 个字节,IDT 共占用 2KB,由 IDTR 存放 IDT 在内存的首地址,每一个表项是一个中断门描述符,陷阱门描述符,或者任务门描述符

下面介绍中断描述符的格式

有了现在的知识,我们就可以来学习IA-32中异常和中断的处理

IA-32 中异常和中断的处理

每条指令 CPU 都会根据执行情况判断内部是否发生了异常事件,在指令结束后判断是否发生了外部中断请求

由此可见,异常事件和中断请求的 检测 都是在某一条指令执行过程中进行的,显然由硬件完成

在 CPU 根据 CS 和 EIP 取下条指令之前,会根据检测的结果判断是否进入中断响应阶段

异常和中断的响应也都是在某一条指令执行过程中或执行结束时进行的,显然也由硬件完成

现在开始叙述所有IA -32 中异常和中断响应过程

  • 确定中断类型号 i(int i),从 IDTR 指向的 IDT 中取出第 i 个表项 IDTi
  • 从 IDTi 中选择段选择符,从 GDTR 中得到 GDT,再从 GDT 中取出相应段描述符,得到对应异常或中断处理程序所在段的 DPL、基地址等信息。Linux 下中断门和陷阱门对应的即为内核代码段,所以 DPL 为 0,基地址为 0
  • 若 CPL < DPL 或编程异常 IDTi 的 DPL<CPL,则发生 13 号异常。Linux 下,前者不会发生。后者用于防止恶意程序模拟 INT n 陷入内核进行破坏性操作
  • 若 CPL≠DPL,则从用户态换至内核态,以使用内核栈。切换栈的步骤:
    • 读 TR 寄存器,以访问正在运行的用户进程的 TSS 段
    • TSS 段中保存的内核栈的段选择符和栈指针分别装入寄存器 SS 和 ESP,然后在内核栈中保存原来用户栈的 SS 和 ESP
  • 若是故障,则将发生故障的指令的逻辑地址写入 CS 和 EIP,以使处理后回到故障指令执行。其他情况下,CS 和 EIP 不变,使处理后回到下条指令执行
  • 在当前栈中保存 EFLAGS、CS 和 EIP 寄存器的内容(断点和程序状态)
  • 若异常产生了一个硬件出错码,则将其保存在内核栈中
  • 将 IDTi 中的段选择符装入 CS,IDTi 中的偏移地址装入 EIP,它们是异常处理程序或中断服务程序第一条指令的逻辑地址(Linux中段基址 = 0)

下个时钟周期开始,从 CS:EIP 所指处开始执行异常或中断处理程序!

什么是 TSS

内核中的 TSS 段记录了每个进程的状态信息,例如,每个进程对应的页表、task 和 mm 等结构信息。

红色那块就是 TSS 段。

从中断程序中跳出来

中断或异常处理程序最后一条指令是 IRET。CPU 在执行 IRET 指令过程中完成以下工作

  • 从栈中弹出硬件出错码(保存过的话)、EIP、CS 和 EFLAGS
  • 检查当前异常或中断处理程序的 CPL 是否等于 CS 中最低两位,若是则说明异常或中断响应前、后都处于同一个特权级,此时,IRET 指令完成操作。否则,再继续完成下一步工作。
  • 从内核栈中弹出 SS 和 ESP,以恢复到异常或中断响应前的用户级进程所使用的栈。
  • 检查DS、ES、FS 和 GS 段寄存器的内容,若其中有某个寄存器的段选择符指向一个段描述符且其 DPL 小于 CPL,则将该段寄存器清 0。这
    是为了防止恶意应用程序(CPL = 3)利用内核以前使用过的段寄存器(DPL=0)来访问内核地址空间。

执行完 IRET 指令后,CPU 回到原来发生异常或中断的进程继续执行

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • http://blog.csdn.net/maochengtao/article/details/30713459...
    3e1094b2ef7b阅读 965评论 0 2
  • mit6.828的JOS系统启动分为两部分,Boot Loader和kern。BIOS加载Boot Loader程...
    __七把刀__阅读 8,408评论 0 8
  • 简介 lab3 将主要实现能运行被保护的用户模式环境(protected user-mode environmen...
    找不到工作阅读 6,902评论 1 8
  • 1 中断介绍 1.1 简介 中断控制是计算机发展中一种重要的技术。最初它是为克服对I/O接口控制采用程序查询所带来...
    疯狂小王子阅读 8,058评论 0 9
  • 有些场景让人难以忍受,比如黑云压城的感觉,比如坐着小船穿过一个只有躺着才能通过的山体,所有人都喜欢海阔天空,一曲天...
    自来诗阅读 867评论 1 13