基于Nand Flash的VIVI裝載器的分析與改進(jìn)
在操作系統(tǒng)啟動(dòng)前,要先運(yùn)行一段程序.這段程序就是BootLoader,即啟動(dòng)裝載程序,它相當(dāng)于PC機(jī)上的BIOS。通過(guò)這段程序,可以實(shí)現(xiàn)硬件設(shè)備的初始化,建立內(nèi)存卒問(wèn)映射等一系列初始化工作,從而將系統(tǒng)的軟硬件環(huán)境初始化為一個(gè)合適的狀態(tài).以便為裝載操作系統(tǒng)作好準(zhǔn)備。在系統(tǒng)加電或復(fù)位后,CPU通常都是從一個(gè)預(yù)先定義的地址上取指令,而在嵌入式系統(tǒng)中,通常將某種類型的固態(tài)存儲(chǔ)設(shè)備(如ROM、FIash等)映射到此地址處。通過(guò)燒寫工具把BootLoader的映像燒寫到這種固態(tài)存儲(chǔ)設(shè)備上,在系統(tǒng)加電或復(fù)位后CPU就可以從這種固態(tài)存儲(chǔ)設(shè)備上取指令執(zhí)行BootLoader以實(shí)現(xiàn)系統(tǒng)的啟動(dòng)。由于在ROM及Flash等存儲(chǔ)設(shè)備中程序的執(zhí)行速度與效率不及程序在RAM中的執(zhí)行速度與效率,因此在嵌入式程序設(shè)計(jì)中,通常都會(huì)有程序拷貝的操作。所謂程序拷貝,就是在程序運(yùn)行過(guò)程中,通過(guò)軟件的方法將周化在ROM或Flash中的程序拷貝到RAM中,然后再跳轉(zhuǎn)到RAM相應(yīng)地址繼續(xù)執(zhí)行程序。
1 系統(tǒng)硬件平臺(tái)及VIVI簡(jiǎn)介
本實(shí)驗(yàn)平臺(tái)的處理器采用的是SamSung公司的S3C2410.它是基于ARM920T內(nèi)核的處理器,片外存儲(chǔ)器采用了64MB的SDRAM、32MB的Nand Flash、2MB的Nor Flash及4KB的片上SRAM,其中SDRAM映射到基地址為Ox30000000的存儲(chǔ)空間,本實(shí)驗(yàn)平臺(tái)支持兩種方式啟動(dòng),即Nand FIash啟動(dòng)和Nor Flash啟動(dòng),這兩種啟動(dòng)方式以跳線方式進(jìn)行選擇。
VIVI是由韓國(guó)Mizi公司開發(fā)的一種針對(duì)ARM9的BootLoader,支持S3C2410。與其它的Boot loader相比,它具有容易理解,易于移植等優(yōu)點(diǎn)。它有兩種工作模式:?jiǎn)?dòng)加載模式和下載模式。它的啟動(dòng)分為兩個(gè)階段,Stage1階段和Stage2階段。Stage1主要用匯編語(yǔ)言編寫,主要進(jìn)行與CPU核有關(guān)的一些寄存器的配置以及進(jìn)行一些必要的初始化工作,這部分代碼與具體的CPU體系結(jié)構(gòu)依賴性很大。Stage2用一般的C語(yǔ)言編寫,用來(lái)實(shí)現(xiàn)一些初始化工作,如建立內(nèi)存映射,初始化驅(qū)動(dòng)等,這部分代碼會(huì)被拷貝到RAM中執(zhí)行。本文要研究和論述的主要在Stage1階段。
2 Nand Flash啟動(dòng)過(guò)程分析
Nand Flash使用I/O口串行地存取數(shù)據(jù),它不映射到存儲(chǔ)空間中任何一個(gè)BANK區(qū)域上.對(duì)Nand Flash的瀆寫操作通過(guò)串行數(shù)據(jù)總線進(jìn)行傳輸。Nand Flash以頁(yè)(page)為單位進(jìn)行讀寫,以塊(block)為單位進(jìn)行擦除,本文用到的Nand Flash頁(yè)(page)大小為(512+16)Byte,塊(block)大小等于32個(gè)頁(yè)的大小。每頁(yè)的最后16Byte不用于存儲(chǔ)程序數(shù)據(jù),它主要用于存儲(chǔ)ECC校驗(yàn)、標(biāo)志位等信息。對(duì)Nand Flash的操作主要是通過(guò)向Nand F1ash控制器發(fā)送命令來(lái)進(jìn)行的,對(duì)不同型號(hào)的Nand Flash,其命令有所不同。由于Nand Flash以塊(block)為單位進(jìn)行擦除,以頁(yè)為單位進(jìn)行寫入,所以擦除與寫入的速度都很快。
由于Nand Flash不能芯片內(nèi)執(zhí)行,S3C2410必須提供一種機(jī)制支持從Nand Flash啟動(dòng)。S3C2410提供了這樣一種機(jī)制,當(dāng)設(shè)置為Nand flash啟動(dòng)時(shí),系統(tǒng)加電或復(fù)位后,使能Nand Flash控制器的自動(dòng)啟動(dòng)模式,Nand Flash中的前4KB代碼自動(dòng)地被拷貝到位于CPU內(nèi)部的稱為Steppingstone的SRAM中,這是啟動(dòng)代碼的第一次拷貝,這次拷貝由硬件自動(dòng)完成.然后這塊SRAM被映射到存儲(chǔ)空間中的0x00000000處,CPU從這個(gè)地址處開始執(zhí)行啟動(dòng)代碼。
由于CPU內(nèi)部的SRAM僅有4KB,不能保證整個(gè)VIVI都被從Nand Flash中拷貝到CPU內(nèi)部的SRAM中,所以這前4KB的代碼要保證完成把整個(gè)VIVI從Nand Flash拷貝到執(zhí)行效率更高的RAM中運(yùn)行以及程序的跳轉(zhuǎn)任務(wù),此時(shí)從Nand Flash到SDARM的拷貝過(guò)程就是所謂的軟件拷貝。
3 程序拷貝過(guò)程分析
3.1 VIVI的編譯與鏈接
編澤器對(duì)程序的處理要經(jīng)過(guò)預(yù)編譯階段、編譯階段、匯編階段及鏈接階段,每個(gè)目標(biāo)文件都有一系列段(section),輸入文件的段(section)稱為輸入段(input section).輸出文件的段(section) 則稱為輸出段(output section)。在VIVI的鏈接過(guò)程中,用到了一個(gè)鏈接腳本文件,它描述了各個(gè)輸入文件的各個(gè)段(section)如何映射到輸出文件的各個(gè)(section)中,并控制輸出文件中secrion和符號(hào)的內(nèi)存布局,此內(nèi)存布局決定了VlVI的運(yùn)行時(shí)域。在此階段,鏈接器LD利用鏈接腳本把各種目標(biāo)文件和庫(kù)文件鏈接起來(lái),并重定向它們的數(shù)據(jù),完成符號(hào)解析,最后把所有的目標(biāo)文件鏈接成為一個(gè)可執(zhí)行的目標(biāo)文件,即為可燒寫到Flash中的VIVI映像。針對(duì)本系統(tǒng)開發(fā)板的VIVI鏈接腳本對(duì)原鏈腳本進(jìn)行了改進(jìn),添加了第<6>行,下文的論述會(huì)用到此處的變量vivi end。
<1>SECTIONS{
<2>.=0x33f00000;
<3>.text :{ * (.text)}
<4>.data ALlGN(4) :{ * (.data)}
<5>.bss ALIGN(4):{ * (.bss) * (COMMON)}
<6>vivi_end=.:
<7>}
其中:SECTIONS表示段。第<2>行表示當(dāng)前地址為0x33f00000,它是text段的起始地址,也是運(yùn)行時(shí)域的起始地址。第<3>行用了通配符*表示所有字符,這里的意思就是說(shuō)指定的每個(gè)目標(biāo)文件的text section的內(nèi)容都放到同一個(gè).text中。第<4>行表示指定的每個(gè)目標(biāo)文件的data section的內(nèi)容都放到問(wèn)一個(gè).data中,而且要四字節(jié)對(duì)齊。每<5>行表示指定的每個(gè)目標(biāo)文件的bss section的內(nèi)容都放到同一個(gè).bss中,所有的普通符號(hào)都放到COMMON中,也要四字節(jié)對(duì)齊。第<6>行是把當(dāng)前地址賦值給變量vivi_end,它也是運(yùn)行時(shí)域的末地址。
評(píng)論