基於Exynos4412平臺,ARM的異常處理機制(異常向量表)
ARM的異常
ARM(V7架構)的工作模式(9種)
- user(用戶工作)
- sys模式
- Supervisor(管理模式 svc)
- Abort (中止模式)
- Undefined (未定義)
- IRQ (中斷模式)
- FIQ (快速中斷模式)
- Monitor (安全模式)
- Hyp (支持虛擬化的模式)
ARM共有9中工作模式,異常模式佔7種,學習ARM的核心是學習ARM的異常處理機制。
-
ARM的異常依靠什麼來進行處理
靠異常向量表來進行處理。 -
什麼是異常向量表
異常事件處理的方法集合。 -
異常向量表放在哪兒
放在內存上。 -
放在內存的什麼地址上
arm規定異常向量表可以放在內存的低位(0x00000000)和內存的高位(0xffff0000)這兩個地址上。 -
內存低位被irom佔用
內存地址範圍: 0x40000000 – 0x80000000 1G片外內存 -
內存高位地址
高位0xffff0000,1G片外內存,沒有高位地址 -
沒有真實的高位地址,能否虛擬一個出來
可以虛擬,需要用到一個硬件設備MMU
什麼是MMU
MMU是內存管理單元,有兩個作用,
- 將虛擬地址轉換爲物理地址。
- 允許內存操作權限。
MMU開啓之後cpu訪問的所有內存地址都是虛擬地址。
- 虛擬地址通過MMU轉換爲物理地址,靠什麼進行轉換
轉換列表,虛擬地址和物理地址的轉換關係表 - 轉換表放在哪兒
放在內存上 - 放在內存什麼位置
由程序員定 - 如何將轉換表放置的內存地址告知CPU
通過cp15協處理器告知cpu
異常向量表
.global _start
.global _end
.align 2
.text
_start: b reset /* 0xffff0000 */
ldr pc, _undefined_instruction /* +0x4 */
ldr pc, _software_interrupt /* +0x8 */
ldr pc, _prefetch_abort /* +0xc*/
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
_undefined_instruction: .word und
_software_interrupt: .word svc
_prefetch_abort: .word pre
_data_abort: .word data
_not_used: .word 0x12345678
_irq: .word irq
_fiq: .word fiq
_end:
reset:
push {r0-r12,lr}
bl clr_bss
bl main
pop {r0-r12,pc}
und:
svc:
push {r0-r12,lr}
sub r0, lr, #4 /* 觸發svc中斷指令的地址 */
mov lr, pc
ldr pc, =do_svc
pop {r0-r12,pc}
pre:
data:
irq:
fiq:
開啓MMU
__asm__ __volatile__(
"MRC p15, 0, r0, c1, c0, 0\n\t"
"orr r0, #(0x1 << 13)\n\t" /* 將異常向量表放在高位 */
"orr r0, #0x1\n\t"
"MCR p15, 0, r0, c1, c0, 0\n\t"
"MCR p15, 0, %[ttb], c2, c0, 0\n\t" /* 將映射列表的起始地址告知cpu */
"mvn r0, #0x0\n\t"
"MCR p15, 0, r0, c3, c0, 0\n\t" /* 擁有管理員權限 */
:
:[ttb]"r"(ttb)
:"r0"
);