Linux为什么不是实时操作系统?
从我们接触Linux系统开始,一直听到的都是它是非实时操作系统,怎么理解这个非实时呢?
我的理解,非实时,就是中断响应不及时,任务调度不及时。那么,真的是这样吗?下面先了解一下,Linux中断响应,是怎样的一个处理流程。
Linux是如何响应中断
ARM中断流程
ARM处理器的中断处理过程,可以分为以下几个步骤:
- 中断请求:外部设备或软件可以向ARM处理器发送中断请求信号,以通知处理器有需要处理的事件发生。中断请求可以是硬件中断(如外部设备的输入触发中断)或软件中断(通过软件指令触发中断)。
- 中断检测:ARM处理器会周期性地检测中断请求是否发生。这个过程通常在每个指令周期的某个时刻进行,被称为中断检测阶段。如果检测到中断请求,处理器将进入中断处理流程。
- 中断响应:当ARM处理器检测到中断请求时,它会保存当前的执行状态,并跳转到中断服务例程(ISR,Interrupt Service Routine)的入口地址。
- 中断处理:进入中断服务例程后,ARM处理器将执行特定的中断处理代码,以完成对中断事件的处理。中断服务例程通常包括保存现场、处理中断事件、恢复现场等步骤。
- 中断返回:在中断处理完成后,ARM处理器会从中断服务例程返回到原来的执行状态。处理器会恢复之前保存的现场,并继续执行被中断的指令。
我们在上面的第三步,存在一个保存现场的过程,它主要进行以下逻辑:
ARM异常处理:处理器对特定的异常事件进行的处理流程(CPU指导硬件自动完成:四大步三小步)。
一、保存现场(四大步):
-
保存CPSR到SPSR_mode
-
适当设置 CPSR 对应功能位(三小步):
a. 切换处理器进入ARM状态:T[5]
b. 根据需要,禁止中断位:F[6] / I[7]
c. 根据异常切换到对应的异常模式:M[4:0] -
保存返回地址:把当前 PC 保存到 lr_mode
-
设置PC = 存放跳转到对应的异常向量表的固定首地址。
Linux的中断入口
我们关注中断响应和中断处理的过程,以ARM A55为例,Linux内核中,中断向量表在 arch/arm64/kernel/entry.S 中有定义:
/*
* Exception vectors.
*/
.pushsection ".entry.text", "ax"
.align 11
SYM_CODE_START(vectors)
kernel_ventry 1, t, 64, sync // Synchronous EL1t
kernel_ventry 1, t, 64, irq // IRQ EL1t
kernel_ventry 1, t, 64, fiq // FIQ EL1h
kernel_ventry 1, t, 64, error // Error EL1t
kernel_ventry 1, h, 64, sync // Synchronous EL1h
kernel_ventry 1, h, 64, irq // IRQ EL1h
kernel_ventry 1, h,