FSBL的數(shù)據(jù)段和代碼段如何連接_第1頁(yè)
FSBL的數(shù)據(jù)段和代碼段如何連接_第2頁(yè)
FSBL的數(shù)據(jù)段和代碼段如何連接_第3頁(yè)
FSBL的數(shù)據(jù)段和代碼段如何連接_第4頁(yè)
FSBL的數(shù)據(jù)段和代碼段如何連接_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀 繼續(xù)免費(fèi)閱讀

VIP免費(fèi)下載

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

文檔簡(jiǎn)介

第第頁(yè)FSBL的數(shù)據(jù)段和代碼段如何連接?搞懂?dāng)?shù)據(jù)段和代碼段是如何被鏈接成一個(gè)二進(jìn)制文件的,這應(yīng)該是每一個(gè)(ARM)(程序員)必須搞清楚的一個(gè)事情。它會(huì)幫助程序員更加透徹的知道ARM是怎么被安排去工作的,所以數(shù)據(jù)段你和代碼段如何鏈接在一起,是我們搞懂FSBL的第一步。

建個(gè)Example工程,不要光顧著看,自己動(dòng)動(dòng)手掌握的更快。

要回答這個(gè)問(wèn)題其實(shí)必須要建一個(gè)工程,相關(guān)的軟件操作流程可以參考各種開(kāi)發(fā)板的實(shí)驗(yàn)手冊(cè),我這里見(jiàn)得描述一下:

現(xiàn)在VIV(AD)O里面新建一個(gè)PL工程,可以自己搭,也可以用范例,本小節(jié)所涉及的PL來(lái)自范例,如下所示,整個(gè)PL實(shí)際上由:

1.1ARM部分(硬核+外設(shè)),如圖中所示的processing_system,其中就包含了除APU以外,還有(DDR),以及FIXED_IO。DDR好理解,就是連接外部DDR存儲(chǔ)器唄,那這個(gè)FIXED_IO是個(gè)啥呢?這個(gè)實(shí)際上就是arm的外設(shè),包含了Q-spi的必要引腳,也包括了DebugInfo所需的串口。總而言之都是ARM的外設(shè)

1.2復(fù)位部分,看名字就很好理解,該模塊專門用于所以Zynq的PL部分部件的復(fù)位

1.3AXIIn(te)rconnect,這個(gè)模塊非常重要,簡(jiǎn)單地說(shuō)這就是一個(gè)總線解析器,一主(一個(gè)masterAXI4)多從(兩個(gè)slaveAXI4)。我們之前提到過(guò),AXI4將會(huì)用于連接Zynq的PS(ARM部分)和PL((FPGA)部分),這里就是一個(gè)例子,后面每一個(gè)SlaveAXI4都連著一個(gè)Xilinx的IP,或者是用戶自定義的具備AXI4的IP。這樣就簡(jiǎn)單了,只要用戶定義的IP包含AXI4(接口),同時(shí)將必要的可讀或者可寫數(shù)據(jù)映射到這個(gè)AXI4接口上,那么Zynq的ARM就能夠通過(guò)總線接觸到這些映射到總線上的數(shù)據(jù),itmeanstheARMcouldread/writeitscontentmappedontheBusofAXI4.

1.4AXIGPIO&AXIBRAMController,這兩個(gè)就是上述的Xilinx的IP,自帶有AXI4總線接口,這樣ARM就能夠通過(guò)總線解析器控制他們

1.5實(shí)際的應(yīng)用,其實(shí)也不會(huì)比這個(gè)在復(fù)雜太多,只是再加一些自定義的IP

2利用這個(gè)范例,我們進(jìn)一步建立BSP,然后基于BSP建立APP(用戶程序),以及FSBL(范例,Zynq的加載程序),如下圖所示,其包含了app,bsp,platf(or)m,fsbl。通過(guò)任何一個(gè)開(kāi)發(fā)版的用戶手冊(cè)都可以獲得完整的工程建立流程,這里不再贅述。

3其中bsp和fsbl里面,包含加載過(guò)程中所用到的所有源碼,下面一一解析。

查看鏈接文件,原來(lái)存儲(chǔ)空間是這樣有條不紊的被分配

點(diǎn)擊FSBL->src->lscript.ld,界面上將會(huì)呈現(xiàn)(這里的(SD)K是2023.2版本):

感謝這個(gè)SDK的開(kāi)發(fā)工具,使得用戶能夠以圖表的方式去查看數(shù)據(jù)段和代碼段的具體分布(以前都是通過(guò)直接看源碼,畢竟(科技)進(jìn)步了~),不過(guò)老程序員可能更喜歡看源碼,那我們就結(jié)合的看吧

這個(gè)圖主要呈現(xiàn)了三部分內(nèi)容:

定義了兩個(gè)存儲(chǔ)空間,包括offset和length,其源碼表達(dá)如下

接下來(lái)定義了堆棧的大小,忘了啥是堆棧的可以自行百度復(fù)習(xí)一下

接下來(lái)就是將FSBL編譯完成后的所有數(shù)據(jù)和代碼,按照一定的順序鏈接生成二進(jìn)制文件,舉個(gè)例子:

上面的源碼的作用是:

(1)定義FSBL的程序入口在==_vector_table==

(2)將代碼段(.text*)鏈接到ps7_(ram)_0_S_AXI_BASEADDR的最前頭,而這里的代碼段實(shí)際包含了.vector等等內(nèi)容,我們查看一下.vectors到底是個(gè)啥吧,搜索一下把,結(jié)果就在bsp的asm_vectors.S((匯編)文件里面)

進(jìn)到這個(gè)匯編程序,如下所示:

這里先關(guān)注兩個(gè)名字,一個(gè)就是==.vectors==,另一個(gè)就是==_vector_table==

看下面的源碼可知,.vectors就是一個(gè).sec(ti)on,相當(dāng)于下面所有的匯編源碼取了一個(gè)別名,叫做.vectors,這些源碼最終被放置到了上述位置!

第二個(gè)需要關(guān)注的是_vector_table,其實(shí)際上就是全局變量(看下面的源碼.globl_vector_table),這個(gè)全局變量在這里就是一個(gè)指針,指向了B_boot這個(gè)操作。

同時(shí)回過(guò)頭看上面的源碼ENTRY(_vector_table),這就是定義了FSBL的程序入口,也就是(cpu)執(zhí)行的第一條指令保存在_vector_table>B_boot

這里可以簡(jiǎn)單的小結(jié)一下,F(xiàn)SBL執(zhí)行的第一條指令就是B_boot,這是通過(guò)查看(編寫)FSBL->src->lscript.ld才獲悉的,可想而知這個(gè)鏈接文件有多重要,后期等我們更加熟悉,可以嘗試一下取修改它,這里做個(gè)記號(hào),繼續(xù)往下走!

ARM要開(kāi)始運(yùn)行FSBL了,然而并不是main()

上面已經(jīng)提及實(shí)際FSBL程序最先被執(zhí)行的語(yǔ)句是B_boot,這是一條匯編指令,意思就是說(shuō)跳轉(zhuǎn)到_boot程序塊,同時(shí)轉(zhuǎn)跳指令B是無(wú)需返回的,所以后續(xù)BUndefined啥的實(shí)際上并不會(huì)被執(zhí)行,看一下**_boot**是什么:

匯編語(yǔ)言不是筆者的強(qiáng)項(xiàng),因此只能大概說(shuō)明一下(有興趣的可以自己逐條查看作用,過(guò)程會(huì)比較痛苦。方式能收獲更多CPU底層的細(xì)節(jié),這里不展開(kāi)):

1針對(duì)CPU0和CPU1有不同的程序,基本就是CPU0干活,CPU1就是WFE

2CPU干的活就是初始化MMU和TLB等等,其中比較關(guān)鍵的就是初始化堆棧(SP(寄存器)指向棧頂),前面也提及過(guò),在鏈接的時(shí)候分配了堆棧空間,而堆棧對(duì)(C語(yǔ)言)函數(shù)是非常重要的。棧的作用:一般來(lái)說(shuō)函數(shù)調(diào)用或者中斷,都會(huì)涉及到現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù),被保護(hù)的現(xiàn)場(chǎng)實(shí)際上就是CPU的幾個(gè)專用的reg,以及正在執(zhí)行的函數(shù)的局部變量等數(shù)據(jù),這些數(shù)據(jù)會(huì)被推進(jìn)棧內(nèi),其相應(yīng)的SP寄存器也會(huì)加上入棧數(shù)據(jù)的長(zhǎng)度,在函數(shù)執(zhí)行返回?fù)]著中斷返回時(shí),棧內(nèi)的數(shù)據(jù)按順序再次出來(lái),總體來(lái)說(shuō)就是先進(jìn)后出。而堆的作用一般就是給系統(tǒng)動(dòng)態(tài)分配存儲(chǔ)空間的,包括用戶經(jīng)常調(diào)用的malloc說(shuō)分配的空間,就是在堆里。簡(jiǎn)而言之,堆棧的完成初始化是為了c語(yǔ)言函數(shù)提供了環(huán)境。否則C語(yǔ)言是無(wú)法正確被執(zhí)行的。

3完成上面一系列的功能后,開(kāi)始一執(zhí)行去第一條C語(yǔ)言函數(shù)**_start**,見(jiàn)下面的匯編代碼

一樣的,我們不仔細(xì)展開(kāi)這段匯編,其實(shí)通過(guò)解釋就能夠明白,這里的主要功能就是初始化各種數(shù)據(jù),包括bss等等。最后,匯編來(lái)到了main,這個(gè)main就是FSBL的主函數(shù),也就是大家比較熟悉的c語(yǔ)言函數(shù)。

小結(jié),實(shí)際上BSP在背后干了好多事情(上述所有的匯編都是bsp提供的),這是為了讓用戶能夠忽略一些技術(shù)細(xì)節(jié),直奔主題main。而這些技術(shù)細(xì)節(jié)已經(jīng)有Xilinx官方為我們完整無(wú)誤的準(zhǔn)備好了,所以FSBL我們其實(shí)只用聚焦在main函數(shù)即可,其他的臟活累活BSP已經(jīng)替我們完成了,我們用不用太操心。不過(guò)通過(guò)上面的一些展開(kāi),大伙兒應(yīng)該也有了一個(gè)模糊的概念,也就是說(shuō)雖然我們寫的所有的函數(shù)都是從main函數(shù)開(kāi)始,然后CPU執(zhí)行的第一條指令,絕對(duì)不是main,而是最基礎(chǔ)的匯編。這個(gè)匯編會(huì)替你搞定c語(yǔ)言環(huán)境,讓我們的main能夠很ojbk的運(yùn)行。下次把目光回到main函數(shù)

終于要開(kāi)始進(jìn)入main()了,激動(dòng)不?

費(fèi)話不多講,直接懟源碼,如下所示

逐條懟:一開(kāi)始就定義了三個(gè)變量,這三個(gè)變量的作用請(qǐng)看下面的解釋

next,接下來(lái)開(kāi)始初始化MIO,PLL,CLK和DDR,調(diào)用的函數(shù)就是ps7_init()

如果看過(guò)我們上一篇blog應(yīng)該有個(gè)印象,MIO不是已經(jīng)被初始化過(guò)一遍嗎,怎么又要?是的,就是這么靈活,也就是說(shuō)你的FSBL可以在Qspi(這樣Boot(ROM)只會(huì)初始化Qspi的接口MIO)里,你的BitStream可以保存在eMMC上,那這個(gè)多出來(lái)的eMMC的MIO也需要在初始化一下了。不多講,直接看ps7_init()

該函數(shù)主要完成:

讀取PS版本,估計(jì)一些老料子的方式略有不同吧

根據(jù)PS版本,賦予相對(duì)應(yīng)初始化數(shù)組的指針。這個(gè)數(shù)組基本上構(gòu)成舉例(ps7_mio_init_data_1_0)如下

可以簡(jiǎn)單的理解為,這個(gè)ps7_mio_init_data_1_0數(shù)組中的而每一個(gè)元素都是一種操作,這個(gè)操作包含了EMIT_WRITE,EMIT_READ等等。比如說(shuō)EMIT_WRITE,為了完成這個(gè)操作,實(shí)際上包含了3個(gè)元素,操作指令碼+地址+數(shù)據(jù)(不同的操作包含的數(shù)據(jù)不同,有些操作會(huì)有四個(gè)元素)。

其想要實(shí)現(xiàn)的功能就是往addrwriteval,比如說(shuō)EMIT_WRITE(0XF8000008,0x0000DF0DU),其想要實(shí)現(xiàn)的功能就是將地址0XF8000008上的數(shù)據(jù)寫為0x0000DF0DU

而0XF8000008這個(gè)地址,通過(guò)查看TRM,實(shí)際上就是給SCLR_UNLOCK寄存器寫入0xDF0D,目的就是為了解鎖SCLR所有的寄存器,使其可寫,也就是說(shuō)沒(méi)有完成這一步的話,SCLR的其余寄存器使不允許寫操作的!

Xilinx希望通過(guò)這種比較奇怪的方式完成了一系列操作(EMIT_WRITE和其他操作)的封裝成一個(gè)組合(ps7_mio_init_data_1_0),這一些列的操作共同完成了比如說(shuō)MIO的初始化,DDR的初始化等等。同時(shí)Xilinx提供了一個(gè)函數(shù)去解讀這些操作,**ps7_config()**正是為了實(shí)現(xiàn)這個(gè)功能,如下所示,利用ps7_config()和ps7_mio_init_data來(lái)完成MIO的初始化

下面來(lái)看一下ps7_config()

該函數(shù)很簡(jiǎn)單,實(shí)際上就是EMIT_WRITE,EMIT_EXIT,EMIT_READ等一系列操作的解包過(guò)程,有興趣的可以深入查看一下。需要注

溫馨提示

  • 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)論