[玩转kernel系列]中断
ARM里的中断通常是指IRQ和FIQ,以IRQ来讲,ARM对IRQ的处理过程大概是这样:
外部设备遇到某一事件发出一个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对应的代码
![endif]--> !--[if> ![endif]--> !--[if> ![endif]--> !--[if>
cpu什么时候由执行用户代码转入执行内核代码?
在发生系统调用或者中断的时候。
处理系统调用的那部分内核代码,由于系统调用是在某一个进程中产生的,所以这部分内核代码将工作在“进程上下文”;
处理中断的那部分内核代码,由于中断往往是和外围设备相关,与进程关系不大,所以这部分代码将工作在“中断上下文”。