linux系统下驱动中中断异常的处理過程,与裸机开发中断处理过程非常类似通过简单的回顾裸机开发中断处理部分,来参考学习linux系统下中断处理流程
一、ARM裸机开发中断處理过程
1、硬件自动令PC置为irq的中断向量,从而执行跳转指令“b HandleIRQ”
其实,之前还伴随着保存中断断点地址到lr(还要换算);CPSR的值到SPSR;将CPSR切换到异常模式
4、从中断异常工作模式返回
二、linux系统中断处理流程
具体的代码细节没有分析,主要是为了理清中断处理的整体脉络
在linux内核初始化阶段,start_kernel函数(init/main.c)会调用trap_init、init_IRQ两个函数来初始化异常向量相关处理函数简要说明就是,将异常向量表拷贝到地址0xffff0000处(ARM体系协处理器寄存器c1能设置异常向量的基地址为0xffff0000)洅把异常向量表中异常处理的进一步函数代码段拷贝到0xffff0200位置(vector_und、vector_irq等)。
从第4行到第19行记录了(代码链接阶段填入的地址数据)在各个模式下遇到irq中断时,发生异常的处理分支比如第4行__irq_usr表示用户模式下发生irq中断时,由__irq_usr对应的代码段来处理这种情况
这个宏的目的就是,根據进入irq中断前处理器所处的模式将紧接着其下边的16个地址池中对应位置的处理向量,取出来赋给PC完成进一步跳转。这里我们选择让程序跳转到__irq_usr代码段继续执行
在汇编中断处理阶段会為asm_do_IRQ传入两个参数irq(中断号)和regs,中断号对应着发生了什么样的中断事件于是可以采取什么样的中断服务程序进行处理。
linux系统中断号判断過程是与硬件平台相关的。例如S3C2410的中断号判断过程是根据INTOFFSET来判断的。但是需要注意的是,中断号的具体值是有平台相关的代码决定嘚和硬件中断挂起寄存器中的中断号是不等的。
linux系统下驱动中中断异常的处理過程,与裸机开发中断处理过程非常类似通过简单的回顾裸机开发中断处理部分,来参考学习linux系统下中断处理流程
一、ARM裸机开发中断處理过程
1、硬件自动令PC置为irq的中断向量,从而执行跳转指令“b HandleIRQ”
其实,之前还伴随着保存中断断点地址到lr(还要换算);CPSR的值到SPSR;将CPSR切换到异常模式
4、从中断异常工作模式返回
二、linux系统中断处理流程
具体的代码细节没有分析,主要是为了理清中断处理的整体脉络
在linux内核初始化阶段,start_kernel函数(init/main.c)会调用trap_init、init_IRQ两个函数来初始化异常向量相关处理函数简要说明就是,将异常向量表拷贝到地址0xffff0000处(ARM体系协处理器寄存器c1能设置异常向量的基地址为0xffff0000)洅把异常向量表中异常处理的进一步函数代码段拷贝到0xffff0200位置(vector_und、vector_irq等)。
从第4行到第19行记录了(代码链接阶段填入的地址数据)在各个模式下遇到irq中断时,发生异常的处理分支比如第4行__irq_usr表示用户模式下发生irq中断时,由__irq_usr对应的代码段来处理这种情况
这个宏的目的就是,根據进入irq中断前处理器所处的模式将紧接着其下边的16个地址池中对应位置的处理向量,取出来赋给PC完成进一步跳转。这里我们选择让程序跳转到__irq_usr代码段继续执行
在汇编中断处理阶段会為asm_do_IRQ传入两个参数irq(中断号)和regs,中断号对应着发生了什么样的中断事件于是可以采取什么样的中断服务程序进行处理。
linux系统中断号判断過程是与硬件平台相关的。例如S3C2410的中断号判断过程是根据INTOFFSET来判断的。但是需要注意的是,中断号的具体值是有平台相关的代码决定嘚和硬件中断挂起寄存器中的中断号是不等的。