博文

目前显示的是标签为“armlinux”的博文

arm-linux中断初始化分析

图片
这篇文档准备简要的分析下arm平台上linux下的中断是如何运行的,本文将先分析初始化时的中断是如何建立的,然后以一个例子来注册一个中断,并详细分析中断触发到调用我们自己的中断例程的整个流程。 本文linux2.6.18的源码和s3c2410的CPU及smdk2410的板子为例来分析代码。 一 中断初始化: 大家都知道arm下规定,在0x00000000或0xffff0000的地址处必须存放一张跳转表, 其格式如下: 上面的这个表我们称之为”异常中断向量表”,表中的IRQ和FIQ位置就是用来存放处理中断函数的地址。至于具体选择在哪一个地址处存放该表, 可由 CPU的协处理器完成 。如s3c2410下由CP15中寄存器1的位13来决定,我们可以通过设置该位来告诉系统我们的向量表在哪。 include/arch/asm-arm/proc-armv/system.h #if __LINUX_ARM_ARCH__ >= 4 //at91rm9200是ARMV4结构 #define vectors_base() ((cr_alignment & CR_V) ? 0xffff0000 : 0) #else #define vectors_base() (0) #endif 可以看到ARMv4以下的版本,该地址固定为0;ARMv4及以上版本,ARM中断向量表的地址由CP15协处理器c1寄存器中V位 (bit[13])控制,V和中断向量表的对应关系如下: V=0    ~    0x00000000~0x0000001C V=1    ~    0xffff0000~0xffff001C 因此,在中断初始化的时候我们要做的就是在IRQ和FIQ的位置处放置我们的中断处理函数地址或跳转语句跳转到我们的中断处理函数。这个过程是在trap_init中完成的,而它由start_kernel()调用。 arch/arm/kernel/traps.c void __init trap_init(void) { unsigned long vectors = CONFIG_VECTORS_BASE;/*跳转表的存放位置(即上面那表的存放位置)*/ /*这些都在entry-armv.S下定义 *stub vector kuser_helper具体指什...