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