三星soc平臺Exynos4412平臺裸機開發介紹(七)之ARM的異常處理機制(異常向量表)

基於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是內存管理單元,有兩個作用,

  1. 將虛擬地址轉換爲物理地址。
  2. 允許內存操作權限。

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"
			);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章