laoniu_sichuan 发表于 2014-11-20 14:33

ARM处理器中断响应的跳转过程

最近看uboot源码中S3C2440的start.S,源码的开始部分就是如下的代码:
.globl _start
_start:        b       reset
        ldr        pc, _undefined_instruction
        ldr        pc, _software_interrupt
        ldr        pc, _prefetch_abort
        ldr        pc, _data_abort
        ldr        pc, _not_used
        ldr        pc, _irq
        ldr        pc, _fiq

_undefined_instruction:        .word undefined_instruction
_software_interrupt:        .word software_interrupt
_prefetch_abort:        .word prefetch_abort
_data_abort:                .word data_abort
_not_used:                .word not_used
_irq:                        .word irq
_fiq:                        .word fiq
网上查找了很多,都说这个是中断向量表,但是可以得出的是比如irq中断发生的时候,ldr pc, _irq会被执行,所以pc的值将会被赋为_irq标号的地址,这一步是很清楚的,但是为什么当pc被赋值为这个之后,pc最终又会被赋值为irq标号的值呢?因为第一次跳转时ldr指令完成的,第二次pc指向_irq标号处并没有一条指令给它赋值为irq标号的值啊?这是一个想不明白的问题,还有一个想不明白的问题,为什么这里不直接使用ldr pc, irq这样的形式一步到位呢,为什么非要跳转两次才跳转到真正的位置呢?
路过的各位大虾,请帮本菜鸟解解惑吧,感激不尽。。。

super皮波 发表于 2014-11-20 15:02

个人理解:
第一次跳转是由arm芯片内定的,每种cpu架构都有自己一套的处理方法
跳一次没有办法安排中断处理函数

ldr      pc, _irq   这里就是将_irq标号所代表的内存中的值给pc了,从而实现中断函数的跳转,你的疑问是什么,没看懂

arm-linux-gcc 发表于 2014-11-20 16:28

ldr      pc, _irq是个伪指令
意思是将_irq这个标号代表的地址中的内容(即irq这个标号代表的地址)赋值给pc

laoniu_sichuan 发表于 2014-11-21 09:17

3楼的解释应该是问题的正解,我最开始问的问题是,既然ldr指令只是将下一处标号的值赋给PC,其实还并不能跳到真正的中断处理函数处去处理中断,看来是我把ldr的指令还是不会用,三楼一下点醒了我。ldr使用的时候不使用等号的话就是将标号(地址)处的内容赋给目标,而不是将标号的地址赋给目标!当使用等号的时候就是将地址赋给目标,而非目标地址内的内容。回复 2# super皮波


   

laoniu_sichuan 发表于 2014-11-21 09:18

小弟谢过了,一语点醒了我。回复 3# arm-linux-gcc


   

super皮波 发表于 2014-11-21 09:59

回复 4# laoniu_sichuan
我说的和3楼的有区别吗。。。。。。


   

laoniu_sichuan 发表于 2014-11-21 14:12

看岔了,你这个也是正解啊!看来我有眼无珠了。。。回复 6# super皮波


   
页: [1]
查看完整版本: ARM处理器中断响应的跳转过程