拳不离手、曲不离口 - Speak with your code, my friend, not your word.

[玩转kernel系列]中断

ARM里的中断通常是指IRQFIQ,以IRQ来讲,ARMIRQ的处理过程大概是这样:  

外部设备遇到某一事件发出一个IRQ中断给中断控制器,中断控制器对这个IRQ进行硬件上的处理,把一些信息记在中断控制器的寄存器上,然后中断控制器通过IRQ中断线给ARM发一个信号。ARM收到信号,开始进行以下处理:  

1)将当前状态的cpsr拷贝到IRQ状态的spsr中。  

2)将pc拷贝到IRQ状态的lr中。  

3)屏蔽cpsr中的IRQ位和FIQ位。  

4)跳转入中断向量表的IRQ表项执行(改变pc的值)。

 以上都是ARM cpu做的事,不需要程序员插手,程序员编的代码需要接在后面处理。

 程序员需要做的是接下来的步骤:

(5) 备份上下文。

e.g.:

       sub         lr, lr, #4

       stmfd      sp!, {r0 - r12, lr}

(6)跳入handler。

 e.g.:

        bl IRQ_Handler

 (7):恢复上下文。

 e.g.:

        ldmfd      sp!, {r0 - r12, sp}^

 就这么简单!

 来看kernel对应的代码

 

继续阅读

cpu什么时候由执行用户代码转入执行内核代码?

在发生系统调用或者中断的时候。

处理系统调用的那部分内核代码,由于系统调用是在某一个进程中产生的,所以这部分内核代码将工作在“进程上下文”;

处理中断的那部分内核代码,由于中断往往是和外围设备相关,与进程关系不大,所以这部分代码将工作在“中断上下文”。