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内核中,PIT产生的中断信号是触发时钟中断的主要来源之一。 ##### 3. 时间戳计数器(TSC) 时间戳计数器(TSC)是一个高精度的计数器,其频率与CPU的时钟频率相同。TSC在每次CPU指令执行周期结束时递增,可...
x86 汇编语言是 Linux 操作系统中最常用的汇编语言之一。Linux x86 汇编语言程序设计主要使用 Nasm 和 GAS 两种汇编器。 2. 编译和链接 Linux 下的汇编程序需要编译和链接才能生成可执行文件。Nasm 是一种自由的...
1. 中断硬件电路 CPU有一个中断允许触发器(IF)和多个可屏蔽中断请求输入端(INTR0~INTRn)以及非屏蔽中断请求输入端(NMI)。当IF为1时,中断开放,CPU能响应中断请求。8259A是一种常见的可编程中断控制器,它通过两个...
本文将对基于X86核心的Linux+Xenomai系统构建+igh主站移植进行详细的解释,涵盖Xenomai简介、grub简介、Linux内核源码下载、Xenomai内核源码下载、IgH EtherCAT内核源码下载等知识点。 一、Xenomai简介 Xenomai是...
通过深入分析Linux 2.4.0内核中的中断机制,我们可以更好地理解操作系统是如何管理外部设备并与之交互的。这对于开发高效的驱动程序和优化系统的整体性能具有重要意义。此外,了解中断机制还有助于开发者在遇到与...
2. 初始化中断硬件:包括对PIC或APIC控制器的初始化,设置中断请求的硬件配置等。 在中断的实现中,还包含了如下内容: - IRQ、Pin、GSI、Vector等概念的解析。 - 中断共享和中断丢失的情况分析。 - 中断消息在...
#### X86中断的硬件支持 在x86架构下,中断处理主要依赖于硬件的支持。8259A中断控制器扮演着重要角色,它是硬件设备与CPU之间的桥梁,用于向CPU发送中断请求。中断向量表寄存器IDTR则用于存储中断向量表IDT的基...
它具备的升级检查功能可以确保你的现有环境满足升级的先决条件,如操作系统兼容性、硬件需求、存储引擎支持等。如果发现有不满足的条件,MySQL Shell会详细输出需要整改的项目,极大地简化了升级过程中的问题排查...
在Linux操作系统中,中断和中断处理程序是核心的组成部分,它们负责系统与硬件之间的通信以及对突发事件的响应。中断和陷阱(陷阱和异常)虽然在性质上有差异,但在处理方式上有很多共同点。 中断,主要由硬件设备...
在Linux内核中,中断和函数调用是操作系统核心功能的重要组成部分,它们是系统响应硬件事件和调度软件任务的关键机制。中断是硬件向CPU发送的一种紧急信号,表明需要立即处理的事件,比如设备完成I/O操作或者有外部...
Linux内核在启动过程中会自动探测和配置系统中的中断硬件。 - **2.1.1 关键数据结构** 为了有效地管理和配置中断硬件,Linux内核定义了一些重要的数据结构: - **struct irq_desc**: 描述符结构,用于描述每个...
这是因为Linux内核不支持中断优先级,所有中断理论上都可以抢占其他中断,但同一中断线的中断不会相互抢占。中断发生时,系统会通过中断门进入,自动关闭中断标志(如x86平台的eflags寄存器的if位)。中断处理函数...
在RVCT22中,头文件提供了对ARM架构特定功能的访问,如中断处理、硬件接口等,确保代码与底层硬件正确交互。 2. **armlib**:这是ARM架构的库文件,包括了基本的数学运算、I/O操作、内存管理等功能。开发者可以链接...
需要注意的是,在x86中断处理中,通过门只能提升运行级别,中断处理通常使用最高特权级的段选择符。此外,TSS在特权级切换时起到了关键作用,保存和恢复ss和esp的值。中断处理程序在完成工作后,通过iret指令返回,...
在Intel X86架构中,最多支持256个中断向量。 2. **中断向量的分配** - 中断向量0-31用于异常和非屏蔽中断,这些是固定的、一对一映射的中断。 - 向量32-47分配给由IO设备引发的可屏蔽中断。 - 向量48-255标记为...
Adeos的关键特性之一是其对于中断管理的支持。通过使用中断管道机制,Adeos能够高效地在不同域之间传递中断信号,并根据各域的优先级进行调度。这一机制是实现强实时性的核心所在。 ##### 2.2 grub简介 grub(grand...
在X86架构下,Linux最多支持256个中断,包括异常、中断和调用门。这些中断按用途分为几类: - 向量号0-19:用于陷阱(异常)门。 - 向量号20-31:保留。 - 向量号32-255:用于外设中断。 #### 四、初始化中断管理...
glibc 2.12是2010年发布的一个版本,包含了对当时最新硬件和操作系统特性的支持。使用此特定版本的glibc意味着MySQL 5.6.46可以与该版本兼容的Linux发行版顺利运行。 3. **64位系统**: 这个版本是为64位架构设计...