1. 前言
在操作系统中,中断是一种重要的机制,因为它允许CPU在执行用户程序的同时响应外部事件,如硬件中断和软件中断。在Linux操作系统中,为了确保稳定性和性能,不同的中断被赋予了不同的优先级。本文将详细介绍Linux中断优先级。
2. 中断概述
中断是一种机制,允许外部硬件或软件以异步的方式打断CPU当前正在执行的程序,以便CPU在执行其它任务的同时响应这些事件。在Linux中,中断分为硬中断和软中断:
2.1 硬中断
硬中断是由硬件提供的一种中断机制。当设备需要CPU处理时,它会将一个中断信号发送到CPU,使其停止当前正在执行的程序,转而执行硬件设备的中断处理程序。这种中断是实时的,可能会导致CPU切换上下文,并且有可能引起IDT项的修改。
2.2 软中断
软中断是一种软件实现的中断机制,它是由内核启动的,并且每个CPU只能有一个软中断进行处理。与硬中断不同,软中断由内核实现,不需要硬件产生中断信号。软中断允许延迟处理并且不考虑实时性,因此对应用程序不造成影响。
3. 中断控制器
中断控制器是硬件的一部分,它用于管理计算机系统中的硬件中断信号。在Linux中,常见的中断控制器有Intel PIC(programmable interrupt controller)和APIC(advanced programmable interrupt controller),为了支持SIMD(single instruction multiple data)指令,Linux还引入了XAPIC(extended APIC)。
在中断控制器中,每个中断都被分配一个特定的IRQ号,当硬件产生一个中断信号时,中断控制器将其传递给适当的IRQ号,内核根据IRQ号确定具体的中断处理程序。
/*
* The IRQ router on the VXP524
*/
static void __init ppc_vxp_irqrouter(void)
{
unsigned int i;
volatile unsigned char *bcsr626 = ioremap(0xfffe015a, 1);
if (!bcsr626) {
printk(KERN_ERR "Cannot map bcsr626 - irq routing disabled.\n");
return;
}
/*
* Route ISA interrupts
*/
outb(0x0, bcsr626 + 0x4);
/*
* Route External interrupts
*/
outb(0x0, bcsr626 + 0x5);
/*
* Route PMC interrupts
*/
outb(0x0, bcsr626 + 0x6);
/*
* Route PCI interrupts
*/
for (i = 0; i < 0x10; i++) {
outb(0xf, bcsr626 + 0x80 + i);
}
iounmap((void *) bcsr626);
}
4. 中断优先级
Linux中断处理程序采用两种不同的优先级。一个是硬件中断优先级,一个是内核线程优先级。当硬件中断信号被触发时,硬件中断优先级被提升到内核线程优先级之上,以确保中断被迅速响应。
在Linux中,中断优先级分为以下六个级别,按优先级从高到低分别是:
实时优先级:用于处理实时应用程序,如交互式输入、音频或视频处理。实时优先级由高到低依次为0~99。
调度优先级:用于处理一般的内核任务,如进程调度、I/O处理和网络协议处理等。调度优先级由高到低依次为100~149。
IRQ优先级:用于处理硬中断并在硬件中断信号被处理时自动启用。IRQ优先级由高到低依次为150~179。
softIRQ优先级:用于处理软中断并在软中断时自动启用。softIRQ优先级由高到低依次为180~189。
NMI优先级:用于处理非屏蔽中断信号。 NMI优先级最高,并且无法被覆盖。
硬中断优先级:与软中断预留的同等优先级,用于处理pmu中断。
5. 总结
在Linux操作系统中,中断是一种重要的机制,它允许CPU在执行用户程序的同时响应外部事件。为了确保稳定性和性能,不同的中断被赋予了不同的优先级。本文详细介绍了Linux中断的基本概念、中断控制器和中断优先级的实现。如果您需要编写Linux驱动程序或优化系统性能,请务必了解这些基本概念。