系统结构中的中断

什么是中断?

中断(Interrupt)是硬件和软件驱动事件,它使得CPU暂停当前的主程序,并转而去执行一个中断服务程序。

当CPU与外设交换信息时,若用查询方式,则CPU就要浪费很多时间去等外设。这是快速的CPU与慢速的外设之间的矛盾,也是计算机发展过程中

遇到的一个严重的问题之一,为了解决这个问题,一方面要提高外设的工作速度;另一方面引入了中断的概念。

中断的分类

在微机系统中,中断可分为外部中断(或硬件中断)和内部中断(或软件中断)。

外部中断

外部中断是指由外部设备通过硬件请求的方式产生的中断,也称为硬件中断。

外部中断又可分为非可屏蔽中断(non-maskable interrupt,NMI)和可屏蔽中断(interrupt request).

CPU通过NMI 和 INTR引脚分别接收这两种中断。

不可屏蔽中断 NMI:当外设通过非屏蔽中断请求信号向微处理器提出中断请求时,微处理器在当前指令执行结束后,就立即无条件的予以响应。

这样的中断就是不可屏蔽中断。不可屏蔽中断在外部中断源中优先级最高,主要用于处理系统的意外或故障,如电源掉电、存储器读/写错误、

扩展槽中输入/输出通道错误等。 

可屏蔽中断 INTR:CPU对可屏蔽中断请求的响应是有条件的,它受中断允许标志位IF的控制。

当IF=1时,允许CPU响应INTR请求;当IF=0时,禁止CPU响应INTR请求。可屏蔽中断用于CPU与外设进行数据交换。

可屏蔽中断受8259A可编程中断控制器的控制。时钟中断(8253定时器发出的中断信号)就属于可屏蔽中断。

系统中必须由硬件实现的中断有:保护中断点,转向中断服务程序入口。

内部中断

内部中断是由CPU运行程序错误或执行内部程序调用引起的一种中断,也称为软件中断,它分为异常和INT n指令中断两类,

内部中断不受eflags中IF位的影响。异常分为故障(Fault)、陷阱(Trap)和中止(Abort)3种。

是在指令执行过程中由于微处理器内部操作发生异常引起的,如硬件失效或非法的系统调用,以及程序员预先设置断点等。

INT n指令中断是指系统执行INT n指令所引起的中断。其实INT n和INT0也归类于异常,属同步性事件。

系统中必须由软件实现的中断有:中断服务,返回到中断点。

CPU处理中断的过程:

X86的中断机制


X86 CPU支持256个中断向量,0~19是系统预定义的异常和NMI,20~31被Intel保留,所以外部中断从32开始(Linux使用80h实现系统调用)。
CPU处理的流程都一样,在执行完当前指令后,根据中断源提供的中断向量,在IDT中找到并调用相应的服务例程。
x86中断分为实模式中断和虚模式中断。在实模式下,0~1KB的内存存放中断向量表,每项由2字节的段地址和2字节的段偏移组成,共256项。
保护模式下,通过中断门实现。x86中断系统具体分类如下结构:

外部中断 :来自CPU外部,由外设的请求引起,通过外部硬件产生,也称为硬件中断。

内部中断 :来自CPU内部,由执行指令引起的。 

非屏蔽中断 :通过NMI引脚引入CPU,不受中断允许标志IF的屏蔽,一个系统一般只允许有一个非屏蔽中断。 

可屏蔽中断 :通过INTR引脚引入CPU,只有当中断允许标志位IF=1时,才能被CPU响应。

通过8259A,一个系统中可有多个可屏蔽中断。

ARM的中断机制

ARM处理器的中断主要有两种:IRQ普通中断和FIQ快速中断。快速中断本质上与普通中断没有太大的差别,它们在处理机制上有许多相同的地方。IRQ中断是最频繁的也是最为影响系统性能的。
在IRQ中断发生时,ARM处理器的硬件会自动执行以下工作:   

将被中断任务模式的CPSR值保存到IRQ模式中的SPSR寄存器中; 置位I位(禁止IRQ中断); 清零T位(进入ARM状态); 

设置MOD位,切换处理器模式为IRQ模式; 将被中断任务模式的PC值保存到IRQ模式中的LR寄存器中; 

将CPSR中的bit7位置1禁止后继IRQ中断的发生; PC被赋予跳转指令的地址值,实现跳转。 

异常处理结束后,异常程序完成下列动作: 将SPSR寄存器的值复制到CPSR寄存器; 

将LR寄存的值减去一个常量后复制到PC寄存器,跳转至被中断的用户程序。 清零在入口置位的中断禁止标志。

FIQ适用于对一个突发事件的快速响应,这是因为该模式下有8个寄存器用来满足寄存器保护的需要。

特权模式下,可通过置位CPSR的F位禁止FIQ异常。IRQ异常由nIRQ输入端的低电平所产生的正常中断。

IRQ的优先级低于FIRQ。相应的在一个特权模式下,都可通过置位CPSR中的I位来禁止IRQ。

ARM的中断机制特点

主要由中断源和控制寄存器两大部分组成,其寄存器主要有四种:模式、屏蔽、优先级、挂起寄存器。具体如下图:

中断系统有6个分仲裁器和一个总仲裁器,每一个仲裁器都可以处理6路中断。

MIPS的中断机制

MIPS中有3种中断模式:

------- 兼容中断模式(Interrupt Compatibility mode); 

------- 向量中断模式(Vectored Interrupt (VI) mode); 

------- 外部中断控制器模式(External Interrupt Controller (EIC) mode)。

MIPS的中断处理,通常来说,和其他体系结构的 中断处理,没有太多的区别,总的来说分为三段:

保存现场寄存器组(Register File)。在堆栈中开辟一段区域,将32个通用寄存器和CP0的相关寄存器,如Status,BadVaddr,Cause等,保存在这段内存中。其中尤为重要的是 EPC,EPC指向引发异常时的指令。 异常处理部分。以Address Error异常为例,当异常发生时,根据保存的BadVaddr,调用两次非对齐加载/存储指令,对内存地址进行数据的读写操作。 返回。将保存在堆栈中的寄存器组内容恢复。

从异常状态返回的这个动作,是由硬件完成的。它必须同时完成三个操作:

将SR寄存器恢复; 返回到EPC寄存器所指向的地址继续执行; 恢复到用户态。

如果这三个过程没有能够“原子地”执行完毕,那么将会导致一个安全漏洞,用户有可能在某种情况下僭越CPU内核态设定的壁垒,从而非法获得管理员权限。

MIPS的中断机制特点

MIPS CPU有8个独立的中断位(在Cause寄存器中),其中,6个为外部中断,2个为内部中断(可由软件访问)。

一般来说,片上的时钟计数/定时器,会连接到一个硬件位上去。
当MIPS CPU发生中断后,CPU的状态变化到如下状态,总结如下列表:
EPC寄存器保存了发生中断是程序执行指令的地址
CP0中STATUS寄存器 EXL置位为1,表示正在异常状态,这个时候CPU不能再响应中断(不管IE是否开启),自动进入核心状态。
CP0中CAUSE寄存器中ExcCode为0,表示是中断异常
CP0中CAUSE寄存器IP被设置为不同的中断号
规则如下:

SR(IE)位控制全局中断响应,为0的话,就禁止所有中断; SR(EXL)和SR(ERL)位(任何一个)如果置1的话,会禁止中断; SR(IM)有8位,对应8个中断源,要产生中断,还得把这8位中相应的位置1才行;

中断处理程序也是用通用异常入口。但有些新的CPU有变化。

三种机器中断处理机制的不同点:(以中断源为例)

当CPU响应中断、保护断点之后,就要进行中断源的识别,即寻找中断源,找到相应的中断服务程序入口。识别中断源有三种方法:查询法、向量法和强置程序计数器法。

查询法(ARM使用):

这是通过程序来查询是哪一个中断源提出的中断请求。该方法需要必要的硬件支持。设置一个输入端口,以便CPU可通过该端口读取各个中断请求触发器的 状态。在响应中断周期之后,对所有的中断,都先进入到这个查询流程。先看中断源1 是否提出请求,若是,转去执行中断源1的中断服务程序,否则再看中断源2是否提出 请求,若是,转去执行中断源2的中断服务程序。否则继续查看后面的中断源。

查询的顺序决定了中断的优先级,这是因为,当发现一个中断源提出中断请求后,就转去执行相应的服务程序,而不再继续向下查找,不管它们是否也提出了请求。中断源1的级别最高,中断源2的级别次之,中断源n的级别最低。
查询法的优点是硬件简单、程序层次分明,只要改变程序中的查询次序即可改变中断源的中断优先级,而不必变更硬件连接,其缺点是速度慢(从CPU响应中断到进入中断服务的时间较长),实时性差,特别是当中断源较多时,尤为突出。此外,查询要占用CPU时间,降低了CPU的使用效率。

向量法(x86使用):

这是一种硬件方法。在CPU发出中断响应信号INTA时,由硬件产生请求中断且在当前所有请求中级别最高的中断源的中断标识码(早期微机系统中称之为中断向量,向量法因此得名,而在8086/8088系统以及PC系列机中称之为中断类型码)。中断标识码是中断源的识别标志,可用来形成相应的中断服务程序的人口地址或存放中断服务程序的首地址。该方法需要的硬件支持。当有中断源提出请求时,中断排队与编码器进行判优并产生其中级别最高的中断源的中断标识码。在INTA来时,CPU通过三态门获得中断标识码。
用向量法识别中断源不占用CPU额外的时间,在中断响应周期即可完成,所以得到广泛的应用。即便在功能相对简单的单片机中,一般也采用此方法。

MIPS和ARM都是RISC架构,但是两者在很多方面有比较大的区别。CPU的行为比ARM更加精简,连TBL查找都需要靠软件来设置。ARM更像是介于MIPS和X86之间的一种CPU,结合了两者的一些特点。




<think>首先,用户的问题是:“我想了解时钟中断是否可以被屏蔽以及相关的机制 请问时钟中断能否被屏蔽及其实现机制”。翻译成英文是:I want to know if clock interrupts can be masked and the related mechanisms. Can clock interrupts be masked and what is the implementation mechanism? 根据系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 参考提供的引用: - 引用[1]:讨论中断屏蔽函数,如disable_irq()和disable_irq_nosync(),用于屏蔽中断源。 - 引用[2]:描述Linux驱动中的中断与时钟机制,特别是S3C6410处理器的RTC中断。 用户的问题是关于时钟中断的可屏蔽性和机制。时钟中断通常指系统定时器中断,如tick中断,用于系统调度和时间管理。 关键点: 1. **时钟中断是否可屏蔽**:是的,时钟中断可以被屏蔽,但需要谨慎处理,因为系统依赖于它。 2. **实现机制**:在Linux内核中,使用中断控制函数来屏蔽和使能中断。具体函数如disable_irq(), enable_irq()等。 3. **相关机制**:包括中断控制器、中断屏蔽位、以及特定于处理器的特性。 回答结构: 1. **逐步解释**: - 先解释时钟中断是什么。 - 然后讨论可屏蔽性。 - 接着描述实现机制。 - 最后提到注意事项。 2. **引用信息**:自然地融入引用,如引用[1]和[2],在相关段落末尾添加引用标识。 3. **生成相关问题**:在回答后,添加“相关问题”部分。 4. **语言**:使用中文。 生成相关问题: - 基于用户问题,生成2-3个相关问题,例如: - 1. 屏蔽时钟中断会对系统产生什么影响? - 2. 如何在Linux内核中安全地屏蔽时钟中断? - 3. 时钟中断与其他中断屏蔽机制有何不同? 完整回答框架: 1. **引言**:解释时钟中断。 2. **可屏蔽性**:说明时钟中断可以被屏蔽。 3. **实现机制**:详细描述函数和过程。 4. **注意事项**:讨论风险和最佳实践。 5. **相关问题**:列出相关问题。</think>### 时钟中断的可屏蔽性及实现机制 时钟中断是操作系统中用于处理时间相关任务(如系统调度、定时器等)的一种硬件中断。在Linux内核中,时钟中断通常由系统定时器(tick 中断)或实时钟(RTC)模块触发。用户询问时钟中断是否可以被屏蔽以及相关的实现机制,我将逐步解释这个问题,确保内容真实可靠,基于Linux内核的通用机制。 #### 1. **时钟中断是否可以被屏蔽?** 是的,时钟中断可以被屏蔽。在Linux内核中,所有中断源(包括时钟中断)都可以通过软件控制进行屏蔽(disable)或使能(enable)。屏蔽时钟中断意味着暂时阻止其触发中断处理程序,这在某些场景下(如调试或关键代码段保护)很有用。然而,屏蔽时钟中断需要谨慎处理,因为它可能导致系统时间不准确、调度延迟或系统不稳定。例如,周期性的tick中断(用于系统心跳)如果被长时间屏蔽,会影响进程调度和定时器功能[^2]。 #### 2. **时钟中断屏蔽实现机制** 时钟中断屏蔽机制依赖于中断控制器(如S3C6410处理器的可编程中断控制器)和内核提供的API函数。以下是关键实现步骤和函数: - **中断屏蔽函数**: 在Linux内核中,屏蔽中断源(包括时钟中断)使用函数如 `disable_irq()` 和 `disable_irq_nosync()`。这些函数作用于中断控制器,屏蔽指定中断号(IRQ)对应的中断源。 - `void disable_irq(int irq);`:屏蔽指定IRQ的中断,并等待当前中断处理完成后再返回。这确保了中断处理的一致性。 - `void disable_irq_nosync(int irq);`:立即屏蔽中断,不等待当前中断处理完成,适用于实时性要求高的场景,但可能导致竞争条件。 这些函数对所有CPU都生效,因为中断控制器是全局资源。例如,屏蔽RTC的tick中断(IRQ号通常固定)可以防止周期性中断触发[^1]。 - **中断使能函数**: 屏蔽后,可以使用 `enable_irq(int irq);` 重新使能中断。内核会维护中断屏蔽状态计数器,多次调用 `disable_irq()` 需要相同次数的 `enable_irq()` 来恢复中断。 - **底层硬件机制**: 时钟中断屏蔽依赖于处理器的中断屏蔽位(如x86的IF标志位或ARM的CPSR寄存器)。在底层,`disable_irq()` 函数通过设置中断控制器的屏蔽寄存器来实现,例如在S3C6410处理器中,RTC模块的tick中断或alarm中断可以通过配置其控制寄存器来屏蔽。具体流程如下: - 内核通过IRQ号识别时钟中断源(如RTC的tick中断)。 - 调用 `disable_irq()` 时,内核向中断控制器发送屏蔽指令,设置对应的屏蔽位。 - 中断控制器会丢弃该中断源的请求,直到屏蔽被解除。 数学上,中断屏蔽可以建模为一个布尔控制:设$M$为屏蔽状态($M=1$表示屏蔽),$I$为中断信号,则输出中断$O$满足$O = I \cdot \overline{M}$。这表示当中断屏蔽时,$O=0$,中断被忽略[^1][^2]。 - **代码示例(伪代码)**: 以下是一个简单示例,展示如何在Linux驱动中屏蔽时钟中断(假设RTC中断IRQ号为32): ```c #include <linux/interrupt.h> void mask_clock_irq(void) { disable_irq(32); // 屏蔽时钟中断,等待当前处理完成 // 执行关键代码,避免中断干扰 enable_irq(32); // 使能中断 } ``` #### 3. **注意事项和风险** - **短期屏蔽安全**:时钟中断通常可以安全屏蔽几微秒到毫秒级别,用于原子操作或临界区保护。内核提供 `local_irq_disable()` 和 `local_irq_enable()` 函数来快速屏蔽所有中断(包括时钟),但仅适用于当前CPU。 - **长期屏蔽风险**:如果屏蔽时间过长(如超过一个tick周期),系统可能丢失时间事件,导致调度器停滞或看门狗超时。例如,S3C6410的RTC中断如果被屏蔽,后备电池供电的时钟仍会运行,但系统时间可能不同步[^2]。 - **最佳实践**:在驱动开发中,优先使用 `disable_irq_nosync()` 用于高性能场景,但需结合锁机制防止竞态条件。始终在屏蔽后尽快使能中断。 #### 4. **总结** 时钟中断可以被屏蔽,实现机制基于中断控制器的软件API(如 `disable_irq()`)和硬件寄存器设置。这在系统调试或实时任务中很有用,但必须谨慎以避免系统不稳定[^1][^2]。如果您有具体硬件平台(如ARM或x86),机制可能略有差异,建议参考内核文档或数据手册。 ### 相关问题 1. 屏蔽时钟中断会对系统性能产生什么影响? 2. 在Linux内核中,如何安全地屏蔽时钟中断而不导致系统崩溃? 3. 时钟中断与其他中断(如网络中断)的屏蔽机制有何区别? [^1]: 引用[1]:驱动篇:中断与时钟(一)。3.使能和屏蔽中断 下列函数用于屏蔽一个中断源 void disable_irq(int irq); void disable_irq_nosync(int irq); disable_irq_nosync()与disable_irq()的区别在于前者立即返回,而后者等待目前的 中断处理完成。注意,这两个函数作用于可编程中断控制器,因此,对系统内的所有 CPU都生效。 [^2]: 引用[2]:linux驱动开发中断与时钟机制,Linux驱动设计—— 中断与时钟。S3C6410 处理器内部集成了实时钟(RTC)模块,该模块能够在系统断电的情况下由后备电池供电继续工作,其主要功能相对于一个时钟,记录年、月、日、时、分、秒等。S3C6410 的RTC可产生两种中断:周期节拍(tick)中断和报警(alarm)中断,前者相当于一个周期性的定时器,后者相当于一个“闹钟”,它在预先设定的时间到来时产生中断
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值