|
ARM體系結(jié)構(gòu)中,把復(fù)位、中斷、快速中斷等都看作‘異常’,當(dāng)這些‘異常’發(fā)生時(shí),CPU會(huì)到固定地址處去找指令,他們對(duì)應(yīng)的地址如下:
| 地址 | 異常類型 | 進(jìn)入時(shí)的工作模式 | | 0x00000000 | Reset | Supervisor | | 0x00000004 | Und | Undefined | | 0x00000008 | Soft interupt | Supervisor | | 0x0000000c | Abort(prefetch) | Abort | | 0x00000010 | Abort(data) | Abort | | 0x00000014 | Reserved | Reserved | | 0x00000018 | IRQ | IRQ | | 0x0000001c | FIQ | FIQ | 首先要明確的一點(diǎn)就是,無論內(nèi)存地址空間是如何映射的,以上這些地址都不會(huì)變,比如當(dāng)有快速中斷發(fā)生時(shí),ARM將鐵定到0X0000001C這個(gè)地址處取指令。這也是BOOTLOADER把操作系統(tǒng)引導(dǎo)以后,內(nèi)存必須重映射的原因!否則操作系統(tǒng)不能真正接管整套系統(tǒng)! LINUX啟動(dòng)以后要初始化這些區(qū)域,初始化代碼在main.c中的start_kernel()中,具體是調(diào)用函數(shù)trap_ini()來實(shí)現(xiàn)的。如下面所示(具體可參照entry-armv.S): .LCvectors: swi SYS_ERROR0 b __real_stubs_start + (vector_undefinstr - __stubs_start) ldr pc, __real_stubs_start + (.LCvswi - __stubs_start) b __real_stubs_start + (vector_prefetch - __stubs_start) b __real_stubs_start + (vector_data - __stubs_start) b __real_stubs_start + (vector_addrexcptn - __stubs_start) b __real_stubs_start + (vector_IRQ - __stubs_start) b __real_stubs_start + (vector_FIQ - __stubs_start)
ENTRY(__trap_init) stmfd sp!, {r4 - r6, lr} adr |