Blob在S3C2440A上的移植
1引言
本文引用地址:http://butianyuan.cn/article/90712.htmBootloader是在操作系統(tǒng)運行之前執(zhí)行的一段程序。通過這段小程序,初始化硬件設(shè)備,建立內(nèi)存空間的映射表,設(shè)置適當?shù)南到y(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做準備。目前流行的可以引導(dǎo)加載Linux的Bootloader包括:支持x86體系結(jié)構(gòu)的LILO,GRUB,ROLO,Loadlin,Etherboot,LinuxBIOS;支持ARM體系結(jié)構(gòu)的Compaq的bootldr,Blob,U-Boot,vivi,RedBoot;支持MIPS體系結(jié)構(gòu)的PMON和支持m68K體系結(jié)構(gòu)的sir-boot。相對于上述Bootloader,Blob具有代碼量小,文件結(jié)構(gòu)清楚等優(yōu)勢,更易于在具有ARM核的器件上移植。
2 Blob簡介
Blob是Boot Loader Object的縮寫,是一款功能強大的Bootloader。它遵循GPL,源代碼完全開放,既可用來進行簡單調(diào)試,也可啟動Linux Kernel。最初的Blob是Jan-DerkBakker和Erik Mouw為一塊名為LART(Linux Advanced Radio Terminal)的板子寫的,該板使用的處理器是StrongARMSA-1100。Blob的主要特征是引導(dǎo)嵌入式Linux功能即把Kernel、根文件系統(tǒng)等從Flash中調(diào)入SDRAM執(zhí)行;存儲操作功能。即支持內(nèi)存查看、修改、比較;設(shè)備驅(qū)動功能。即支持串口,F(xiàn)lash、外部SDRAM等驅(qū)動;命令交互功能??稍诿钚邢略诰€更新Blob,Kemel和ramdisk。
3 Blob的運行過程分析
圖1給出Blob的啟動示意圖。定義Blob編譯后的最大代碼為64 KB,并且這64 KB分為兩個階段來執(zhí)行。第一階段的代碼在start.s中定義,大小為1 KB,包括從系統(tǒng)上電后在0x00000000地址開始執(zhí)行的部分。這部分代碼包括對S3C2440A的一些寄存器的初始化和將Blob第二階段代碼從Flash拷貝到SDRAM中。除去第一階段的1 KB代碼,剩下的部分都是第二階段的代碼。第二階段的起始文件為trampoline.s,被復(fù)制到SDRAM后,就從第一階段跳到這個文件開始執(zhí)行剩余部分代碼。第二階段的代碼最大為63 KB,trampoline詞義為"蹦床",所以在該程序中進行一些BSS段設(shè)置和堆棧的初始化等工作后,最后跳轉(zhuǎn)到main.c進入C函數(shù)。
圖2給出目標開發(fā)板QQ2440V3的Flash存儲器空間分配圖。系統(tǒng)上電后,先執(zhí)行第一階段代碼,進行相應(yīng)的初始化后,將Blob第二階段代碼復(fù)制到SDRAM地址bloc_abs_base,然后跳轉(zhuǎn)到第二階段開始執(zhí)行。圖3給出了SDRAM布局。在第二階段中,從匯編跳轉(zhuǎn)到C語言編寫的Main()函數(shù),將繼續(xù)對外圍的硬件初始化(串口,USB等),從Flash中將Kernel,ramdisk分別加載到SDRAM的Kernel區(qū)域和ramdisk區(qū)域,根據(jù)用戶選擇,進入命令行模塊或啟動Kernel。
由于Flash的存儲空間有限,所以存放在Flash中的Linux內(nèi)核是經(jīng)過壓縮的。Blob將壓縮的Linux內(nèi)核加載到SDRAM地址0x30008000。如果選擇啟動Linux,那么壓縮的Linux內(nèi)核將自解壓到0x30008000,然后跳轉(zhuǎn)到Linux Kernel首地址,啟動Linux。由圖3可見,Blob_base和blob_abs_base兩部分。blob_abs_base是Blob將自身的第二階段代碼復(fù)制到SDRAM所在的區(qū)域,而blob_base則是從Blob進行自升級或調(diào)試的區(qū)域。
4 SC32440A上Blob的移植過程
blob-2.0.5-pre2版本的移植工作是在微處理器S3C2440A和對應(yīng)的系統(tǒng)板QQ2440V3的基礎(chǔ)上執(zhí)行的。表1給出了系統(tǒng)板硬件資源配置。
4.1建立交叉編繹環(huán)境
首先在宿主機(一般為PC)上安裝標準Linux操作系統(tǒng),然后安裝交叉編譯工具鏈即可建立編譯環(huán)境。這里的主機端(PC)開發(fā)平臺選用Linux操作系統(tǒng),使用的交叉編譯工具為arm-linux-gcc-2.95.3。
4.2移植操作內(nèi)容
根據(jù)Blob的文件結(jié)構(gòu)加入移植所需的相關(guān)文件、宏定義及變量。在configure.in加入目標板的定義;在acconfig.h加入目標板定義,例如:添加/*Define for s3c24-40A*/#undefs3c2440A。類似的在include/blob/arch.h中添加目標板頭文件s3c2440A.h,并把加人的目標板頭文件復(fù)制到blob/arch目錄下,同時添加目標板相關(guān)頭文件到Makefile.am;在utils/build/build_all和utils/build/build_Makefile中把目標板s3c2440A賦值給變量"arch",并在src/blob/Makefile.am文件中,把與目標板相關(guān)的源文件s3c2440.c添加到變量EXTRA_blob_rest_elf32_SOURCES中。最后一步就是把目標板源文件s3c2440.c,memsetup-s3c2440.s,nandflash.c復(fù)制到src/bolb目錄下,在include/blob/linux.h中加入結(jié)構(gòu)體系號。
Blob啟動匯編文件的修改。修改Blob啟動文件start.s,包括關(guān)看門狗Watchdog(上電后,Watchdog默認是打開的);禁止所有中斷;初始化系統(tǒng)時鐘;配置PLLCON寄存器,以決定系統(tǒng)的主頻;禁止MMU;禁止CACHE;初始化SDRAM刷新速率,修改memsetup,并初始化存儲器空間等。
注意:在BLOB源代碼中有處BUG,將src/blob/lib/command.c中GetCommand()函數(shù)的else if(c==/b)修改為else if(c==0x7f),支持Backspace功能。
5 Blob編譯與測試
5.1 Blob編譯
完成初級移植工作后完成可運行配置命令./configure--with-board=S3C2440--with-linux-prefix=/home/2440blob-en-able-xmodem-enable-md5-with-commands=used進行相關(guān)配置。最后,執(zhí)行make,即完成編譯。
5.2 Blob測試結(jié)果
系統(tǒng)采用NAND Flash啟動,在運行編譯好的Blob之前必須通過JATG口把blob/src/blob目錄下編譯生成好的Blob映像文件和linux zImage,ramdisk映像文件燒錄到NANDFlash中,如果在前述的工作中沒有問題,板子上電就可以從串口看到歡迎信息。加載Linux內(nèi)核和文件系統(tǒng)后,等待幾秒,如果沒有操作,將啟動操作系統(tǒng),否則出現(xiàn)提示符,以下是help命令測試結(jié)果。
6結(jié)語
研究了Blob在S3C2440上的移植方法及過程,對于其工作原理及所移植開發(fā)板的硬件資源配置是Bootloader移植工作成功與否的關(guān)鍵。目前移植好的Blob已經(jīng)能穩(wěn)定地在開發(fā)板上運行,實現(xiàn)了串口與PC通信、查看、修改內(nèi)存、引導(dǎo)Linux操作系統(tǒng)等功能,為后續(xù)開發(fā)奠定了良好基礎(chǔ)。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)萬能遙控器相關(guān)文章:萬能遙控器代碼
c語言相關(guān)文章:c語言教程
linux相關(guān)文章:linux教程
評論