`
memorymyann
  • 浏览: 266053 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

linux学习之五X86对中断的硬件支持

阅读更多

CPU支持256个中断向量,早期的CPU把内存中从0开始的1K字节作为一个中断向量表,当从引脚中得到中断信号后,便读取中断向量号,并根据中断向量号得到相应的中断服务程序的入口地址,从而执行入口地址。
CPU进入保护模式后,对中断响应做了大幅度修改。首先中断向量表的表项从单纯的入口地址改变了意义,称之为“门”。意思为中断发生后,只有通过这些门才可以进入中断服务程序。但门的作用不仅仅限于中断,只要想切换CPU的运行状态就得通过门。因此门根据其用途被分为4种:任务门,中断门,陷阱门和调用门。除任务门外,其它们的结构类似。门的大小都是8字节,64位。

1。任务门
从高向低位看,前16位闲置不用,第17位为P标志位(1表示在内存,0表示不在内存)。第18位至第20位是描述项的优先级别。一个0位,第22位到25位是类型码为101标识任务门。第26位至33位闲置不用。第34位到50位为TSS段选择码,最后16位闲置不用。

P标志位的意义,表示所指向的中断服务程序是否在内存。
描述项的优先级别,用于权限控制。(后面会详细介绍)
当CPU相应中断后,TSS段选择码会起到相当于寄存器CS和DS的作用。TSS是16位,高13位便是内存页面表项,类似于CS和DS,根据第14位选择GDT或者LDT。这样就指向一个特殊的地方。称为“任务状态段”TSS(貌似没经过页式内存管理),其中TSS保存了CPU运行现场包括各个寄存器信息。CPU接下来会将TSS中的运行现场载入到CPU(在次之前CPU会把载入前的现场保存到一个相应的TSS中,CPU中新增的寄存器TR会指向这个TSS)。这样就完成了一次任务切换。实际上linux不采用这种门来实现任务的切换,对于操作系统来说任务也就是进程(可以这么说吧)。但进程带有的信息远远大于CPU中的任务。

2.另外3种门的结构类似。从高向低看,最高16位为位移高16位。接下来是P位,DPL位,一个D位(D位1表示32位,0表示16位)和类型码位(110中断门,111陷阱门,100调用门),3个0占了3个位置,5个闲置不用位,16个段选择码(TSS不知道能不能这么叫,书上没这么写,还是不叫TSS了),和位移的低16位。由此看来类型码和上面的任务门处于同一位置,这样大概硬件不管碰到哪种门都可以取得正确的类型码,然后决定如何来解析这个数据结构吧。和上面区别是,上面的任务门不是一个程序的入口,而是一个任务入口,也就是进程入口(当然linux可能不承认,但CPU设计人员可不这么想)。程序的新入口是需要段内位移的(任务当然不需要)。中断门和陷进门的区别是在于中断门会关闭中断标志位(也就是将CPU中一个用于控制是否该相应中的寄存器赋值为0,这样就屏蔽了可屏蔽中断,但像断电这种不能屏蔽中断自然屏蔽不了),从而防止嵌套中断的出现。而陷阱门则不会(为什么这么分,这和中断的类型有关)。
16位的段选择码和TSS意思差不多,跟CS和DS寄存器的意义类似,高13位为段表的下标,根据第14位选择LDT或者GDT,找到段描述结构(保护模式段式内存寻址的内容),这样我们就获得了一个TSS(已经不新鲜了,内存地址印射不知道看了多少遍了)。
DPL的意义,硬件上实现非常复杂。用简单的目光看下(所谓的简单目光就是不看任务门和调用门的实现过程),当一个中断到的时候,我们根据中断项找到一个中断门(也可能是陷阱门),这是硬件就会拿CPU的CPL(CPU的运行级别,也就是段寄存器的最低3位了)和DPL对比。CPL必须小于或者等于DPL,就穿过了这道门。我们就会到了新程序的入口了,再将它的CPL和DPL相比,DPL应该小于等于CPL,这样就有一个不等式,中断前的CPL=<DPL=<中断后的CPL,意思就是当我们穿过门后,我们的运行级别上升了。如果一次不满足,那就会发生异常。

门介绍完了,现在看看中断的流程:首先CPU接收到中断信号,响应中断(如果它能够响应这个中断的话)。CPU会将当前的EFLAGS寄存器内容压入堆栈(至于EFLAGS寄存器干嘛用的,读者可以自己看看CPU的逻辑图查查,我只隐约记得貌似是用来保存一些控制信息的,比如是否响应中断的寄存器就是其中一个位置,知道的回帖说下),返回地址也会被压入堆栈(返回地址就是CS和取令指针EIP的内容了)。如果中断是异常引起的(比如除以0异常),则表示异常原因的出错代码也会被压入栈中。进一步,如果运行级别前后也发生了变化,那堆栈也会被更换(堆栈更换的原因:运行级别不同了,堆栈空间自然要更换,你不应该在系统状态下使用用户堆栈空间,或许这没什么,但如果是在用户状态下使用系统堆栈呢?至于新的堆栈,也就是新的SS和ESP寄存器的值则是在TSS这个数据结构中,TSS寄存器中本来包含一个ES和ESP,这是这个任务的堆栈,还包含3个额外的ES和ESP,分别用于0,1,2这3个不同级别下的堆栈,为什么这么做,我也不太清楚,或许看到后面能明白吧)。CPU就根据TR寄存器内容找到TSS,用相应的堆栈来替换原来的,这样原来的堆栈指针也要被压入新的堆栈中。(有点复杂)。
最后,中断向量表已经不限制于内存0地址这个位置了,它的起始地址保存在新增寄存器IDTR中。
(关于TR这个寄存器的意义我还是不太清楚,希望看到这篇文章的人,知道的回帖能告诉下,谢谢)

分享到:
评论

相关推荐

    Linux驱动开发:Linux内核模块、字符设备驱动、IO模型、设备树、GPIO子系统、中断子系统.zip

    该项目以Linux内核为核心,围绕其构建了一个完整的操作系统,包括各种系统工具、库、应用程序和硬件支持。 以下是Linux项目的一些主要特点和资料介绍: 开放源代码:Linux项目的所有源代码都是公开的,并允许任何...

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8 系统调用 3.9 系统调用号与跳转表 ...

    LINUX内核源代码情景分析

    3.1 X86 CPU对中断的硬件支持 3. 2 中断向量表IDT的初始化 3. 3 中断请求队列的初始化 3. 4 中断的响应和服务 3. 5 软中断与Bottom Half 3.6 页面异常的进入和返回 3. 7 时钟中断 3. 8 系统调用 3. 9 系统...

    linux内核源代码情景分析

    3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8 系统调用 3.9 系统调用号与...

    Linux编程--Linux内核

    Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 1.1.5 地址空间 9 1.1.6 时钟 9 1.2 软件基础 9 1.2.1 计算机语言 9 1.2.2 什么是操作...

    清华大学Linux操作系统原理与应用

    5.3.1 中断和异常的硬件处理 116 5.3.2 中断请求队列的建立 117 5.3.3 中断处理程序的执行 119 5.3.4 从中断返回 121 5.4 中断的下半部处理机制 121 5.4.1 为什么把中断分为两部分来处理 122 5.4.2 小任务机制 122 ...

    linux 内核源代码分析

    3.1 X86 CPU对中断的硬件支持 3. 2 中断向量表IDT的初始化 3. 3 中断请求队列的初始化 3. 4 中断的响应和服务 3. 5 软中断与Bottom Half 3.6 页面异常的进入和返回 3. 7 时钟中断 3. 8 系统调用 3. 9 系统...

    Linux编程从入门到精通

    第五部分 Linux内核具体系统结构 摘要 341 第1章 前言 342 1.1 目标 342 1.2 Linux介绍 342 1.3 软件系统结构的背景知识 342 1.4 方法与途径 343 1.5 适用本书的读者 344 1.6 本部分的章节安排 344 第2章 系统结构 ...

    LINUX内核源代码情景分析(上).part1.rar

    3.1 x86 cpu对中断的硬件支持 3. 2 中断向量表idt的初始化 3. 3 中断请求队列的初始化 3. 4 中断的响应和服务 3. 5 软中断与bottom half 3.6 页面异常的进入和返回 3. 7 时钟中断 3. 8 系统调用 3. 9 系统...

    linux编程白皮书

    本书对Linux操作系统及其编程作了整体的介绍,以支持用于开发软件的公开源码模型。对内存管理、进程及其通信机制、PCI、内核模块编程及内核系统结构作了详细的解释,且附有很多程序代码实例。对深入研究Linux下的...

    linux操作系统内核技术-uestc课件

     8介绍系统时钟和硬件定时器,单处理器和多处理器上的linux计时体系结构,定时的时间插补原理,单处理器和多处理器上的时钟中断处理,动态定时器的数据结构和算法原理,定时器竞争情形,延迟函数。Time,...

    LINUX编程白皮书 (全集)

    第五部分 Linux内核具体系统结构 摘要 341 第1章 前言 342 1.1 目标 342 1.2 Linux介绍 342 1.3 软件系统结构的背景知识 342 1.4 方法与途径 343 1.5 适用本书的读者 344 1.6 本部分的章节安排 344 第2章 系统结构 ...

    Linux内核源代码分析视频课-视频教程网盘链接提取码下载.txt

    然后开始分析Linux内核源代码,从系统调用陷入内核,进程调度与进程切换,最后返回到用户态进程,通过仔细分析梳理这一过程,并推广到硬件中断、缺页异常等内核执行路径,最终能从本质上把握Linux内核的实质,乃至在...

    Linux内核 内容很全

    中断处理与设备驱动程序 60 6.1 中断与中断处理 60 6.1.1 可编程中断控制器 61 6.1.2 初始化中断处理数据结构 61 6.1.3 中断处理 62 6.2 设备驱动程序 63 6.2.1 测试与中断 64 6.2.2 直接...

    Linux内核情景分析

    3.1 X86 CPU对中断的硬件支持 3. 2 中断向量表IDT的初始化 3. 3 中断请求队列的初始化 3. 4 中断的响应和服务 3. 5 软中断与Bottom Half 3.6 页面异常的进入和返回 3. 7 时钟中断 3. 8 系统调用 3. 9 系统调用号与...

    嵌入式Linux实时技术研究

    Linux具有功能强大、开放源码、支持多种硬件平台、模块化设计等优点,在嵌入 式领域得到了广泛的应用。但同时Unux是一个分时操作系统,其不可抢占的内核、粗 糙的时钟粒度、频繁关中断、使用虚拟内存及缓冲机制等...

    Linux内核情景分析(非扫描版)

    3.1 X86 CPU对中断的硬件支持 3. 2 中断向量表IDT的初始化 3. 3 中断请求队列的初始化 3. 4 中断的响应和服务 3. 5 软中断与Bottom Half 3.6 页面异常的进入和返回 3. 7 时钟中断 3. 8 系统调用 3. 9 系统调用号与...

    eXtensible Modular Hypervisor Framework:最新x86的Hypervisor研发,支持DRTM + 2D分页-开源

    XMHF当前在最近的多核x86硬件虚拟化平台上运行,并支持动态信任根和嵌套(二维)分页。 该框架能够运行未经修改的具有多处理器功能的传统多操作系统,例如Windows和Linux。 可在以下位置获得文档:...

    LINUX编程白皮书

    本书对Linux操作系统及其编程作了整体的介绍,以支持用于开发软件的公开源码模型。对内存管理、进程及其通信机制、PCI、内核模块编程及内核系统结构作了详细的解释,且附有很多程序代码实例。对深入研究Linux下的...

Global site tag (gtag.js) - Google Analytics