關(guān)于一個(gè)arm 異常向量表的問(wèn)題的擴(kuò)展
今天在上chinaunix 的時(shí)候,一個(gè)網(wǎng)友有關(guān)中斷向量表的問(wèn)題。
本文引用地址:http://www.ex-cimer.com/article/201611/317545.htm具體的鏈接http://bbs.chinaunix.net/thread-3620484-1-1.html,對(duì)于這個(gè)問(wèn)題,我講了我的一些看法,那個(gè)同學(xué)表示completely 明白了,我也覺(jué)的很高興~
對(duì)于問(wèn)題,我覺(jué)的牽扯的東西還是比較多,所以我今天就決定就這個(gè)問(wèn)題,在簡(jiǎn)單的拓展一下~
對(duì)于一個(gè)特定(ARM)的機(jī)器而言,一般有3個(gè)軟件的生命周期。
第一個(gè) 生命的周期稱之為 rom boot(一級(jí)boot),這是有具體的芯片生產(chǎn)商來(lái)實(shí)現(xiàn)的。這個(gè)rom boot 十分重要,因?yàn)樗憔唧w的產(chǎn)品量產(chǎn),以及機(jī)器的啟動(dòng)方式有著很重要的關(guān)系.
三星 有個(gè)芯片叫 6410 ,它的啟動(dòng)方式有 nand flash 啟動(dòng) 和sd 啟動(dòng),就是說(shuō)你可以通過(guò)多個(gè)外部 IO 口的高低電平來(lái)確定是從SD 啟動(dòng),還是從nand flash 啟動(dòng).那么為什么會(huì)這樣呀?
原因就是rom boot.比如說(shuō),如果6410 是從SD 啟動(dòng),那么rom 會(huì)根據(jù)外部 IO 高低電平來(lái)得知這個(gè)信息,并從SD 卡的某個(gè)扇區(qū)讀取數(shù)據(jù)(這個(gè)數(shù)據(jù)是用戶自己的軟件,對(duì)于6410來(lái)講 是uboot),加載到ddr 中.
第二個(gè) 生命的周期是 boot loader (二級(jí)boot)
第三個(gè)生命的周期是 system
對(duì)于發(fā)帖的內(nèi)容我是這個(gè)回應(yīng)的,
就是在bootloader 和你的system 是運(yùn)行在同一機(jī)器上兩個(gè)不同的軟件。
uboot 完成必要的操作后,就把控制權(quán)交給了system
這里面有兩個(gè)階段
階段1 uboot 運(yùn)行階段,這時(shí)候如果出現(xiàn)異常,就會(huì)轉(zhuǎn)到絕對(duì)地址(假設(shè)映射的是存儲(chǔ)介質(zhì)A)上去比如說(shuō) undefine,但是在udefine 處理中,是一個(gè)死循環(huán),這個(gè)也是有道理的,因?yàn)樵赽ootloader 中不允許出現(xiàn)異常,所以這時(shí)候你要檢查你自己bootloader 中的代碼。
階段2 system運(yùn)行階段, 由于這個(gè)時(shí)候,已經(jīng)進(jìn)行了地址的remap ,所以絕對(duì)地址 映射的是不同的存儲(chǔ)介質(zhì)B。介質(zhì)B中的undefine 中的處理就是system 軟件定義的undefine ,和你uboot中的不是一回事。
從上面我的回應(yīng)可以看出
我主要闡明的觀點(diǎn)是
軟件的生命周期 。發(fā)帖的同學(xué)其實(shí)是把軟件的第二生命周期和第三生命周期混為一談了。
接著讀者又問(wèn)
現(xiàn)在不解的問(wèn)題是,是不是編譯器把異常向量編譯到特定的地址上,然后CPU發(fā)生異常才跳轉(zhuǎn)呢? 不管你的代碼怎么寫的,只要發(fā)生(undefine)異常,cpu就會(huì)到0x00000004 這個(gè)地址去指令 其他的異常也是一樣(這是一個(gè)硬件的行為)。具體你0x00000004 上是什么內(nèi)容,那就是你軟件的事情了(你寫的代碼和編譯的事情了)。 還有我們是不是必須在整個(gè)程序的第二行開始寫異常向量表呢, 恩,這個(gè)是規(guī)定好的,我見(jiàn)過(guò)的程序都是這樣寫的,另外arm 相關(guān)的手冊(cè)上應(yīng)該有相應(yīng)的說(shuō)明內(nèi)容。 這是一種和編譯器的約定嗎? 這個(gè)是arm 硬件約定的,但是需要用編譯的來(lái)實(shí)現(xiàn),確定把處理異常的代碼放在正確的位置(中斷向量表) |
通過(guò)我上面的回答,可以看出有時(shí)候具體的軟件的code 是和硬件息息相關(guān)的,哪個(gè)位置需要什么樣的代碼,都是規(guī)定好的,我覺(jué)得這是一個(gè)驅(qū)動(dòng)軟件和應(yīng)用軟件的區(qū)別。如果要做底層軟件的話,也必須了解硬件,因?yàn)橛行┐a可能看起來(lái)是沒(méi)有邏輯的,但是這些代碼的邏輯性確實(shí)是存在的,只不過(guò)這個(gè)觀看代碼的主體不是人,而是你的機(jī)器,你的硬件,你的網(wǎng)卡,你的SD host,太多了~
評(píng)論