因?yàn)樽罱救艘鲆粋(gè) bf537 程序的啟動(dòng)程序,主要研究了 uboot 的一些資料和 537 的引導(dǎo)模式的資料。下面談?wù)剬?duì) 537 的啟動(dòng)和加載一些理解。
在說(shuō) 537 的加載之前,有必要先要了解一下 537 的 ldr 文件的結(jié)構(gòu), ldr 文件的單元是許多 block, 每個(gè) block 塊都包含 10 個(gè)字節(jié)的文件頭,每個(gè) 10 字節(jié)的文件頭包含 4 字節(jié)的地址段, 4 字節(jié)的 COUNT (字節(jié)數(shù))段, 2 字節(jié)的標(biāo)志段。 Blackfin 的代碼加載模式以 flash 引導(dǎo)模式為例來(lái)描述:上電— > 復(fù)位— > 片內(nèi) bootrom 執(zhí)行,讀flash 的 0x0 地址,按照 block 頭中的 4 個(gè)字節(jié)地址,和字節(jié)數(shù),把 block 搬移到 ram 中指定的地址,如此往復(fù)。(前面省略了初始化代碼的執(zhí)行過(guò)程,因?yàn)楸救苏J(rèn)為它對(duì)解釋此過(guò)程沒(méi)有意義,反而容易迷惑,故省略),以上是代碼的加載過(guò)程,此過(guò)程跟 uboot 沒(méi)有一毛錢(qián)的關(guān)系。
啟動(dòng)方式跟代碼的加載方式?jīng)]有太大的聯(lián)系,所謂 8 中啟動(dòng)模式,只是處理器從何處開(kāi)始執(zhí)行或者說(shuō)是從何處加載執(zhí)行代碼而已,加載過(guò)程跟 flash 引導(dǎo)下加載類(lèi)似,都是按照 block 塊的結(jié)構(gòu)加載的,唯一的不同就是代碼的來(lái)源不同。
啟動(dòng)過(guò)程,這里就涉及到一些 uboot 的知識(shí)了,其實(shí)本人認(rèn)為如果設(shè)置成 Flash 引導(dǎo)模式的話(huà),根本不用uboot ,在這里 uboot 的作用就顯得很弱了,就只是一個(gè)更新系統(tǒng)的作用。下面慢慢說(shuō)來(lái),所謂 uboot 引導(dǎo),其實(shí)就是在應(yīng)用程序啟動(dòng)之前,先運(yùn)行 uboot , uboot 的強(qiáng)大功能在于更新系統(tǒng),就是程序下載(程序搬移)。為了能夠?qū)崿F(xiàn)程序下載的功能, uboot 首先要初始化一下處理器的一些寄存器,如設(shè)置時(shí)鐘頻率等,為下載功能代碼的運(yùn)行建立一個(gè)軟件環(huán)境。所以如此說(shuō)來(lái), uboot 的運(yùn)行就可以 這么描述:
(1) 調(diào)用一系列的初始化函數(shù)。
(2) 進(jìn)去命令循環(huán)(即整個(gè) boot 的工作循環(huán)),接受用戶(hù)從串口輸入的命令,然后進(jìn)行相應(yīng)的工作。(這里可以運(yùn)行一些調(diào)試命令和下載命令)
在第二步這里一般是有個(gè)等待時(shí)間的,等待時(shí)間到,沒(méi)有任何命令輸入, uboot 就自動(dòng)跳轉(zhuǎn)到應(yīng)用程序,完成所謂的引導(dǎo)。
個(gè)人認(rèn)為, uboot 的主要作用還是在下載程序,如果在等待時(shí)間內(nèi),什么命令都不輸入,就直接繼續(xù)往下運(yùn)行了,這時(shí) uboot 的作用其實(shí)并不大。所以 uboot 只是在系統(tǒng)啟動(dòng)前的一段代碼而已,這段代碼就是實(shí)現(xiàn)了程序下載功能(當(dāng)然你得輸入命令),就是系統(tǒng)的在線更新。
其實(shí)代碼的加載,啟動(dòng)模式, uboot 的引導(dǎo)過(guò)程,這三者的關(guān)系更像是從微觀想宏觀的擴(kuò)展,要弄清 537 的程序的加載和整個(gè)系統(tǒng)的啟動(dòng)過(guò)程。不要把代碼的加載和 uboot 的引導(dǎo)弄混了,根據(jù)以上的分析,他們其實(shí)并沒(méi)有什么聯(lián)系。加載(以 Flash 引導(dǎo)為例)是從 flash 一個(gè)一個(gè) block 得往 ram 里面復(fù)制,此時(shí)這些工作是由 537 的片內(nèi)bootrom 做的。而 uboot 引導(dǎo)的主要完成的功能是,在系統(tǒng)需要更新時(shí),把新系統(tǒng)下載到 Flash 的制定區(qū)域內(nèi),此時(shí)這些工作是由 uboot 來(lái)完成的,在系統(tǒng)不需要更新時(shí), uboot 運(yùn)行完了就直接去運(yùn)行用戶(hù)程序了,此時(shí) uboot 是沒(méi)什么用的。
以上是本人對(duì) 537 的程序加載, uboot 引導(dǎo)的理解,錯(cuò)誤之處,歡迎拍磚。
|