ULK第四章里明确讲到“Linux实现了一种没有优先级的中断模型”,并且“Linux中断和异常都支持嵌套”。这个我不太理解了,这两种说法都与我以前的理解刚好相反,核对了原书,翻译没有错。
Linux中断系统到底是否支持优先级,可否嵌套,中断号又是怎么来确定的,中断产生时又是如何一步步执行到中断处理函数的。为了彻底搞懂Linux中断系统,我决定从最原始材料出发,一探究竟。(s3c2440+linux2.6.21)
先来看看ARM的硬件执行流程
异常是ARM处理器模式分类,ARM有七种运行模式USR,SYS,SVC,IRQ,FIQ,UND,ABT
五种异常模式:SVC,IRQ,FIQ,UND,ABT
中断模式是ARM异常模式之一(IRQ模式,FIQ模式),是一种异步事件,如外部按键产生中断,内部定时器产生中断,通信数据口数据收发产生中断等。
1.当一个异常产生时,以FIQ为例,CPU切入FIQ模式时,
①将原来执行程序的下一条指令地址保存到LR中,就是将R14保存到R14_fiq里面。
②拷贝CPSR到SPSR_fiq。
③改变CPSR模式位的值,改到FIQ模式。
④改变PC值,将其指向相应的异常处理向量表。
离开异常处理的时候,
①将LR(R14_fiq)赋给PC。
②将SPSR(SP