Zynq FSBL代碼導(dǎo)讀.doc_第1頁
Zynq FSBL代碼導(dǎo)讀.doc_第2頁
Zynq FSBL代碼導(dǎo)讀.doc_第3頁
Zynq FSBL代碼導(dǎo)讀.doc_第4頁
Zynq FSBL代碼導(dǎo)讀.doc_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

FSBL代碼導(dǎo)讀一、main函數(shù)執(zhí)行之前FSBL模板的代碼是跟ISE的版本有關(guān)的,我用的是14.3,內(nèi)容會比14.2版更多一點(diǎn),但是基本過程是一樣的。板子上電之后,最先執(zhí)行的并不是FSBL中的main函數(shù),因?yàn)檫@個時候板子還沒有初始化,不具備執(zhí)行C語言的能力,此時只能執(zhí)行匯編代碼,所執(zhí)行的代碼是由BSP提供的。我們打開zynq_fsbl_bspps7_cortexa9_0libsrcstandalone_v3_07_asrc文件夾,里面有一個asm_vector.S文件,這個文件聲明了一個代碼段,位于地址0處。開機(jī)之后,PS自動執(zhí)行地址0處的指令,其第一句話就是一個跳轉(zhuǎn):B _boot。如下:于是就跳轉(zhuǎn)到boot.S中執(zhí)行_boot標(biāo)號下的代碼了,_boot會對系統(tǒng)做初始化,當(dāng)它執(zhí)行完后,PS將具備執(zhí)行C代碼的能力,接著在_boot的代碼中,再次執(zhí)行了一個跳轉(zhuǎn):_start標(biāo)號位于xil.crt0.S中,仍然對系統(tǒng)進(jìn)行設(shè)置,我們看到,第一句話就是跳轉(zhuǎn)到_cpu_init去執(zhí)行cpu初始化。代碼部分截圖如下: 在_start的末尾,BSP終于完成了自己的工作,PS將跳轉(zhuǎn)到main函數(shù)開始執(zhí)行。如下:二、main函數(shù)執(zhí)行過程終于系統(tǒng)進(jìn)入了FSBL階段。我們打開zynq_fsblsrc文件夾,然后打開main函數(shù):Main函數(shù)首先是一些宏定義,接下來就是執(zhí)行ps7_int()函數(shù)。SDK是一個很智能的工具,圖中的灰色陰影部分是SDK判斷出了PEEP_CODE這個宏沒有定義,所以用灰顏色提示讀者這段代碼不用執(zhí)行。ps7_init函數(shù)位于ps7_init.c文件中。這個C文件是由XPS根據(jù)用戶的配置自動生成的。我們進(jìn)入ps7_init函數(shù)看一下,這個函數(shù)很短:根據(jù)代碼,很明顯可以猜到,ps7_init函數(shù)其實(shí)執(zhí)行了mio,pll,clock,ddr和某些外設(shè)的初始化。我們接著看FSBL的main函數(shù),根據(jù)XPS自動生成的ps7_init.c執(zhí)行完初始化之后,F(xiàn)SBL將根據(jù)啟動狀態(tài)寄存器判斷是采用的哪種啟動模式。有四種啟動模式,分別是QSPI,NOR,JTAG,SD卡等模式。每種模式都有一段獨(dú)立的代碼,舉個例子,我們看SD卡模式的執(zhí)行代碼:可以看到,系統(tǒng)先對SD卡初始化,并且要求SD卡中必須要有BOOT.BIN文件。如果沒有,那么從SD卡啟動板子就會失敗。這也是為什么我們生成啟動鏡像必須命名為BOOT.BIN的原因。需要注意的是NAND啟動模式被禁用了,因?yàn)镕SBL中有一個宏沒有定義,所以處于灰色狀態(tài)。接下來的代碼我們只看一下注釋就大概知道干什么了: 在明確了啟動模式之后,PS將在相應(yīng)的flash中去尋找.bit文件和用戶程序,通過遍歷一些partition(最多15個),如果找到了.bit文件,那么就不重啟,直接配置PL,然后再找用戶程序。如果沒找到.bit就軟件復(fù)位一下,然后調(diào)整地址,接著驗(yàn)證下一個partition。充分體現(xiàn)這個過程的,是這個函數(shù):PartitionMove函數(shù)很復(fù)雜,我們只看注釋:這個注釋說的就是找到了.bit文件就配置PL,找到了用戶程序就加載到內(nèi)存。這個函數(shù)執(zhí)行完之后,返回值就是用戶程序的執(zhí)行地址。這個執(zhí)行地址位于用戶文件的文件頭中,是由編譯器或者ISE自己生成的。找到了用戶程序的執(zhí)行地址,那么FSBL函數(shù)就該交接了,完成這個過程的是FsblHandoff函數(shù):這個函數(shù)完成交接,并且一去不復(fù)返,再也不會返回,從此PS就開始執(zhí)行了用戶代碼。那么交接究竟是怎么完成的?其實(shí)我們直觀上很容易猜到肯定是一個跳轉(zhuǎn)指令。帶著猜測,我們深入FsblHandoff函數(shù),最后果然找到了:其中bx lr指令就是跳轉(zhuǎn)到用戶代碼執(zhí)行。3、 拓展FSBL事實(shí)上,在找到用戶程序的執(zhí)行地址后,F(xiàn)SBL并沒有馬上執(zhí)行跳轉(zhuǎn),而是執(zhí)行了這個函數(shù):這是一個鉤子函數(shù),它只有函數(shù)定義,但是沒有任何內(nèi)容,是個空函數(shù)。是FSBL提供給用戶自己擴(kuò)展的,你可以在這個函數(shù)中填寫任何可執(zhí)行內(nèi)容。該函數(shù)會在交接到用戶程序之前執(zhí)行。類似的函數(shù)還有FsblHookAfterHandoff( )。這樣在交接到用戶代碼之后也有鉤子函數(shù),同樣,在FSBL找到.bit文件配置PL前后,也有兩個鉤子函數(shù)。這幾個鉤子函數(shù)貌似只有14.3版本里面有,14.2里面沒有。4、 FSBL的限制FSBL有兩個限制,這是寫用戶程序的時候需要知道的:1,FSBL沒有重新映射內(nèi)存,所以內(nèi)存的基地址是1M,用戶代碼只能在1M以上的地址中執(zhí)行。根據(jù)我的理解,只要修改FSBL,定義ECC_ENABLE,讓如下代碼從被禁止?fàn)顟B(tài)恢復(fù)成可執(zhí)行狀態(tài)就可以破解這個限制:原因在于,很多系統(tǒng)代碼都是這樣的,將1M以下的地址空間作為函數(shù)出錯的返回地址。FS

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論