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