国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

基于Nand Flash的VIVI裝載器的分析與改進

發(fā)布時間:2010-4-22 11:46    發(fā)布者:我芯依舊
關(guān)鍵詞: Flash , NAND , VIVI , 裝載器
引言

在操作系統(tǒng)啟動前,要先運行一段程序.這段程序就是BootLoader,即啟動裝載程序,它相當(dāng)于PC機上的BIOS。通過這段程序,可以實現(xiàn)硬件設(shè)備的初始化,建立內(nèi)存卒問映射等一系列初始化工作,從而將系統(tǒng)的軟硬件環(huán)境初始化為一個合適的狀態(tài).以便為裝載操作系統(tǒng)作好準(zhǔn)備。在系統(tǒng)加電或復(fù)位后,CPU通常都是從一個預(yù)先定義的地址上取指令,而在嵌入式系統(tǒng)中,通常將某種類型的固態(tài)存儲設(shè)備(如ROM、FIash等)映射到此地址處。通過燒寫工具把BootLoader的映像燒寫到這種固態(tài)存儲設(shè)備上,在系統(tǒng)加電或復(fù)位后CPU就可以從這種固態(tài)存儲設(shè)備上取指令執(zhí)行BootLoader以實現(xiàn)系統(tǒng)的啟動。由于在ROM及Flash等存儲設(shè)備中程序的執(zhí)行速度與效率不及程序在RAM中的執(zhí)行速度與效率,因此在嵌入式程序設(shè)計中,通常都會有程序拷貝的操作。所謂程序拷貝,就是在程序運行過程中,通過軟件的方法將周化在ROM或Flash中的程序拷貝到RAM中,然后再跳轉(zhuǎn)到RAM相應(yīng)地址繼續(xù)執(zhí)行程序。

1 系統(tǒng)硬件平臺及VIVI簡介

本實驗平臺的處理器采用的是SamSung公司的S3C2410.它是基于ARM920T內(nèi)核的處理器,片外存儲器采用了64MB的SDRAM、32MB的Nand Flash、2MB的Nor Flash及4KB的片上SRAM,其中SDRAM映射到基地址為Ox30000000的存儲空間,本實驗平臺支持兩種方式啟動,即Nand FIash啟動和Nor Flash啟動,這兩種啟動方式以跳線方式進行選擇。

VIVI是由韓國Mizi公司開發(fā)的一種針對ARM9的BootLoader,支持S3C2410。與其它的Boot loader相比,它具有容易理解,易于移植等優(yōu)點。它有兩種工作模式:啟動加載模式和下載模式。它的啟動分為兩個階段,Stage1階段和Stage2階段。Stage1主要用匯編語言編寫,主要進行與CPU核有關(guān)的一些寄存器的配置以及進行一些必要的初始化工作,這部分代碼與具體的CPU體系結(jié)構(gòu)依賴性很大。Stage2用一般的C語言編寫,用來實現(xiàn)一些初始化工作,如建立內(nèi)存映射,初始化驅(qū)動等,這部分代碼會被拷貝到RAM中執(zhí)行。本文要研究和論述的主要在Stage1階段。

2 Nand Flash啟動過程分析

Nand Flash使用I/O口串行地存取數(shù)據(jù),它不映射到存儲空間中任何一個BANK區(qū)域上.對Nand Flash的瀆寫操作通過串行數(shù)據(jù)總線進行傳輸。Nand Flash以頁(page)為單位進行讀寫,以塊(block)為單位進行擦除,本文用到的Nand Flash頁(page)大小為(512+16)Byte,塊(block)大小等于32個頁的大小。每頁的最后16Byte不用于存儲程序數(shù)據(jù),它主要用于存儲ECC校驗、標(biāo)志位等信息。對Nand Flash的操作主要是通過向Nand F1ash控制器發(fā)送命令來進行的,對不同型號的Nand Flash,其命令有所不同。由于Nand Flash以塊(block)為單位進行擦除,以頁為單位進行寫入,所以擦除與寫入的速度都很快。

由于Nand Flash不能芯片內(nèi)執(zhí)行,S3C2410必須提供一種機制支持從Nand Flash啟動。S3C2410提供了這樣一種機制,當(dāng)設(shè)置為Nand flash啟動時,系統(tǒng)加電或復(fù)位后,使能Nand Flash控制器的自動啟動模式,Nand Flash中的前4KB代碼自動地被拷貝到位于CPU內(nèi)部的稱為Steppingstone的SRAM中,這是啟動代碼的第一次拷貝,這次拷貝由硬件自動完成.然后這塊SRAM被映射到存儲空間中的0x00000000處,CPU從這個地址處開始執(zhí)行啟動代碼。

由于CPU內(nèi)部的SRAM僅有4KB,不能保證整個VIVI都被從Nand Flash中拷貝到CPU內(nèi)部的SRAM中,所以這前4KB的代碼要保證完成把整個VIVI從Nand Flash拷貝到執(zhí)行效率更高的RAM中運行以及程序的跳轉(zhuǎn)任務(wù),此時從Nand Flash到SDARM的拷貝過程就是所謂的軟件拷貝。

3 程序拷貝過程分析

3.1 VIVI的編譯與鏈接

編澤器對程序的處理要經(jīng)過預(yù)編譯階段、編譯階段、匯編階段及鏈接階段,每個目標(biāo)文件都有一系列段(section),輸入文件的段(section)稱為輸入段(input section).輸出文件的段(section) 則稱為輸出段(output section)。在VIVI的鏈接過程中,用到了一個鏈接腳本文件,它描述了各個輸入文件的各個段(section)如何映射到輸出文件的各個(section)中,并控制輸出文件中secrion和符號的內(nèi)存布局,此內(nèi)存布局決定了VlVI的運行時域。在此階段,鏈接器LD利用鏈接腳本把各種目標(biāo)文件和庫文件鏈接起來,并重定向它們的數(shù)據(jù),完成符號解析,最后把所有的目標(biāo)文件鏈接成為一個可執(zhí)行的目標(biāo)文件,即為可燒寫到Flash中的VIVI映像。針對本系統(tǒng)開發(fā)板的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>行表示當(dāng)前地址為0x33f00000,它是text段的起始地址,也是運行時域的起始地址。第<3>行用了通配符*表示所有字符,這里的意思就是說指定的每個目標(biāo)文件的text section的內(nèi)容都放到同一個.text中。第<4>行表示指定的每個目標(biāo)文件的data section的內(nèi)容都放到問一個.data中,而且要四字節(jié)對齊。每<5>行表示指定的每個目標(biāo)文件的bss section的內(nèi)容都放到同一個.bss中,所有的普通符號都放到COMMON中,也要四字節(jié)對齊。第<6>行是把當(dāng)前地址賦值給變量vivi_end,它也是運行時域的末地址。

3.2 程序拷貝的改進

在嵌入式系統(tǒng)中,映像文件都是存儲在Flash存儲器等一些非易失性器件中的,而在運行時,映像文件中的RW段必須重新裝載到可瀆寫的RAM中。這就涉及到映像文件的加載時域和運行時域:加載時域就是指映像文件燒入nash中的狀態(tài),
也就是映像文件運行之前的地址;運行時域是指映像文件執(zhí)行時的狀態(tài),針對本文提到的Nand Flash啟動方式可以這么理解加載時域與運行時域:加載時域的起始地址從(映射后的內(nèi)部SRAM處)0x00000000開始,運行時域的地址從0x33f00000開始。由于加載時域與運行時域的地址不同,從加載時域到運行時域的轉(zhuǎn)換要由系統(tǒng)引導(dǎo)程序完成,所以VIVI必須進行數(shù)據(jù)和代碼的拷貝及程序跳轉(zhuǎn)工作,以完成從加載時域到運行時域的轉(zhuǎn)換。

VIVI的拷貝首先要確定拷貝的起始地址和目標(biāo)地址,還要確定要拷貝多少代碼。在此筆者對所搬運代碼量進行了改進,下面是改進前的代碼:

ldr r0,=VIVI_RAM_BASE
<2>mov rl,#Ox0
<3>mov r2,#0x20000
<4>bl nand_read_ll

其中:第<1>行:獲取VIVI在RAM中的基地址VIVI_RAM_BASE,也是運行時域的首地址。第<2>行:獲取VIVI映像在Flash中的起始地址OxO。第<3>行:獲取拷貝的代碼量0x20000。第<4>行:跳轉(zhuǎn)到nand_read_ll函數(shù),它是用C語言寫的拷貝函數(shù)(略)。此時寄存器rO,rl,r2是傳遞給函數(shù)nand_read_ll的三個參數(shù)。

程序這樣設(shè)計的缺點是不論VIVI映像有多大,它都會拷貝128KB的代碼量,這樣造成時間及空間的浪費或者拷貝不完整,為此筆者對上述代碼進行改進:

[1]ldr   r0,=VIVI_RAM_BASE
[2]ldr   r2,=vivi_end
[3]sub   r2,r2,r0
[4]mov   r2,r2,lsr #9
[5]mov   r2,r2,lsr #9
[6]add   r2,r2, #0x200
[7]mov   r1,#OxO
[8]bl    nand_read_ll

代碼中用到了外部變量vivi_end,它是在鏈接腳本文件中定義的,是VIVI映像運行時域的末地址,在此代碼中使用前要用如下語句進行聲明:

.extern vivi_end

其中:第[l]、[7]、[8]行的解釋分別與未改進前的第、<2>、<4>行。第[2]行:獲取VIVI映像運行時域的末地址。第[3]行:獲取拷貝的真實代碼量。第[4],[5],[6]行:上文論述到Nand Flash是按頁進行讀寫的,本文用到的Nand Flash每頁有(512+16)Byte,實際用于存儲映像文件的是每頁的前512Byte。所以需要對上述“真實代碼量”進行調(diào)整,把它調(diào)整為整數(shù)頁大小,它的大小必須是頁對齊的。首先把它的低9位調(diào)整為0,即是把代碼量不足512Byte的部分清零,然后再加1頁(page)大小(Ox200)以保證VlVI數(shù)據(jù)的完整性,這就是第[4],[5],[6]行的作用。對此代碼進行改進后,拷貝的代碼量更接近實際的代碼量,拷貝的冗余代碼量不會達到1頁(page)的大小。對于其它類型的Nand Flash可以根據(jù)頁的大小進行類似的改進。

3.3 程序的跳轉(zhuǎn)

針對本文所論及的系統(tǒng),當(dāng)系統(tǒng)加電或復(fù)位后,首先Nand Flash中的前4KB由硬件拷貝到位于0x40000000處的大小為4KB的內(nèi)部SRAM中,然后此SRAM被映射到BankO處(Ox00000000)。PC從0x00000000處取指令執(zhí)行。當(dāng)遇到B或BL等跳轉(zhuǎn)指令時,它會跳到當(dāng)前地址加上一個偏移量的位置,它們屬于相對跳轉(zhuǎn),它們的跳轉(zhuǎn)范圍是±32 MB,這使得B或BL指令不依賴于代碼的存儲位置,此時這些地址為加載時域的地址。在嵌入式系統(tǒng)中,還有一種實現(xiàn)長跳轉(zhuǎn)的方式,就是使用ldr指令,它町以實現(xiàn)程序的絕對跳轉(zhuǎn),跳轉(zhuǎn)范圍為4G空間。

VIVI中實現(xiàn)程序跳轉(zhuǎn)的代碼為:

@jump to rain
ldr r1.=on_the_ram
<2>add pc, r1, #O
<3>1: b  lb  @ infinite loop
<4>on_the_ram:

上文提到了加載時域與運行時域的概念,此時第<1>行獲取的on_the_ram的地址就是運行時域的地址,此地址由上述鏈接腳本文件決定,第<2>行跳轉(zhuǎn)到SDRAM中的on_the_ram處。

為了進一步深入說明程序的跳轉(zhuǎn),可以利用VIVI的反匯編文件來查看上述代碼的反匯編情況。現(xiàn)分別給出此段代碼下載時域和運行時域的存儲布局。

下載時域此段代碼在內(nèi)部SRAM中的存儲布局為:

<1>000000dc: e59f1278 ldr rl,[pc,#278];0x35c
<2>000000eO: e281f000 add pc,rl,#0
<3>000000e4: eafffffe  b Oxe4
<4>000000e8
...
<5>00000358:000055aa andeq r5,rO,r10,lsr #ll
<6>0000035c: 33f000e8 mvnccs rO.#240

運行時域此段代碼被拷貝到SDRAM中的存儲布局:

[1]33fOOOdc: e59f1278 ldr r1,[pc,#278]
[2133f000eO: e281f000 add pc,rl,#0
[3] 133mooe4: eaffffffe  b Oxe4
[4]33fOOOe8
...
[5]33f00358: 000055aa andeq  r5,rO,r10,lsr #11
[6]33f0035c: 33fOOOe8 mvnccs rO,#240

系統(tǒng)加電或復(fù)位從基地址0x00000000運行到上述代碼的第<1>行時,r1獲得地址0x0000035c處的值,從第<6>行知道此地址處的值為33f000e8,運行到第<2>行處,進行跳轉(zhuǎn),由于此時程序映像已經(jīng)拷貝到SDRAM中,程序就跳到了運行時域此段代碼的第[4]行處斷續(xù)執(zhí)行下面的程序,從而實現(xiàn)了程序從SRAM到SDRAM的跳轉(zhuǎn)。

4 結(jié)語

Boot Loader的設(shè)計是嵌入式系統(tǒng)中的重要環(huán)節(jié),它為系統(tǒng)的正常啟動完成了一系列的初始化工作,設(shè)計一個簡單高效功能強大的Boot Loader是嵌入式系統(tǒng)設(shè)計中一項重要工作。

本文的創(chuàng)新點:深入研究和分析了VIVI如何實現(xiàn)自己拷貝以及拷貝后如何實現(xiàn)程序的跳轉(zhuǎn),并給出了原理性和實驗性的說明;<2>對程序進行了改進,主要體現(xiàn)在拷貝的代碼量上及VIVI的鏈接腳本上,使程序設(shè)計更合理。

項目經(jīng)濟效益在10萬元左右。


作者:庫少平,田云芳      來源:《微計算機信息》(嵌入式與SOC)2009年第3-2期。
本文地址:http://m.qingdxww.cn/thread-10695-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区二区久久精品 | 手机看片高清日韩精品 | 欧美日韩一区二区在线观看视频 | 四虎国产永久在线精品免费观看 | 91国偷自产一区二区三区蜜臀 | 麻豆国产精品入口免费观看 | 四虎新网站| 韩国一级黄色录像 | 欧美在线不卡 | 亚洲香蕉影视在线播放 | 亚洲日本在线看片 | 日日操夜夜操天天操 | 午夜在线成人 | 亚洲第一视频在线播放 | 韩国一级毛片在线高清免费 | 国产精品久久现线拍久青草 | 在线视频观看亚洲 | 一二三四在线社区 | 麻豆md国产在线观看 | 在线观看免费视频国产 | 久久99热不卡精品免费观看 | 东北话清晰刺激对白 | 亚洲网站黄色 | 99精品视频在线观看re | 青青草色青伊人 | 日韩视频网址 | 日本高清视频免费在线观看 | 91资源在线观看 | 久久精品成人一区二区三区 | 久久99草 | 四虎影视永久费观看在线 | 国产亚洲一区二区在线观看 | 在线视频精品免费 | 国产欧美精品专区一区二区 | 99在线观看国产 | 在线成人免费视频 | 国产成a人片在线观看视频 国产产一区二区三区久久毛片国语 | 四虎影视免费永久在线观看 | 亚洲欧美国产精品第1页 | 亚洲国产成人精品不卡青青草原 | 日韩一区二区三区在线免费观看 |