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

下載本文檔

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

文檔簡(jiǎn)介

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論