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