根據s3c2410晶元的cp15協處理器,可以將其異常向量的位址選擇是高位址或是低位址。比如高位址的復位向量是0xffff 0000, 低位址的復位向量是0x0000 0000。對於使用ads除錯測試**,我們通常都是使用低向量位址,因為s3c2410晶元自帶乙個4k的steppingstone,可以利用這4k的ram作為向量位址的物理儲存空間。
而wince是使用高異常向量位址,這個是在armtrap.s裡面設定的,同時也在這個檔案裡設定了所有異常向量的位址。這裡就有乙個疑問了,在0xffff 0000的這個位址處並沒有物理的儲存空間可以存放**啊?
我的理解是,wince啟動首先是由oal的startup函式開始,在這個函式的末尾,他傳遞乙個oemaddresstable的實體地址和虛擬位址的對映表給os,然後跳轉到kernelstart這個函式執行,這個函式首先就是根據傳過來的表配置虛擬記憶體,在第二級頁表時也配置好了0xffff 0000這個向量入口位址到某乙個實體地址處,也就是說該0xffff 0000並不是某乙個實體地址,它是乙個虛擬位址,os映**乙個實體地址給它,這樣這些異常處理函式的入口就有實際的意義了,因此上面的疑問就可以解決了。
我設想的跳轉過程是這樣的,以復位異常為例。當設定為低異常向量位址,且沒有使能mmu。當復位異常產生時,核心(不是os,而是處理器核心)強制從0x0000 0000處取指,通常我們都會在0x0000 0000處放置一條跳轉指令,然後執行復位異常。當設定為高異常向量位址,且使能了mmu,也就是wince的這種情況時,當復位異常產生時,核心(同樣還是處理器核心)強制從0xffff 0000處取指,因為使能了mmu,它會自動將這個位址對映到對應的實體地址處,這樣就跳轉到了合適的異常處理程式的入口了。
我沒有仔細的分析過armtrap.s的**,請高手指教啊。等仔細分析過後,如果能分析通的話,我會把**分析貼上來的。
希望有朋友可以一起溝通,交流!
my name: leo email: [email protected] (注意leo前有個下劃線)
異常向量表
1.1異常 exceptions 異常 因為內部或者外部的一些事件,導致處理器停下正在處理的工作,轉而去處理這些發生的事件。1.2異常型別 arm處理器支援7種型別的異常 1.3異常向量 當一種異常發生的時候,arm處理器會跳轉到 對應該異常的固定位址去執行異常處理程式,而 這個固定的位址,就稱之為...
設定異常向量表
異常 因為內部或者外部的一些事件,導致處理器停下正在處理的工作,轉而去處理這些發生的事件。arm處理器支援的異常型別為 由圖可知,arm處理器支援7種異常型別,分別是重新啟動,未定義指令,軟中斷,預取異常,資料異常,中斷,快速中斷。異常向量 當一種異常發生的時候,arm處理器會跳轉到對應該異常的固定...
ARM的異常及向量表
arm具有7種異常,分別為 1 復位 2 未定義指令 3 軟中斷 4 預取指令終止 5 資料終止 6 中斷請求 irq 7 快速中斷請求 fiq 用一句通俗的話去表達arm的運 況,那就是arm總會在執行在以上7種異常情況的某一種之下。初初了解arm時總會難於去了解這個 異常 是什麼樣的乙個意思,到...