基於ARM9的嵌入式Linux系統移植

                   這篇文章是我6個月前在老師的指導下寫的論文,留在博客裏,做個備份,那時我的系統環境是window 7虛擬機下的RedHat Enterprise Linux6.0 ,現在我的系統環境是Ubuntu13.04。講的比較粗糙,有不正確的地方希望大家指出。

                    

        本文結合S3C2440處理器和GT2440開發板這個實驗平臺,進行了嵌入式Linux的移植Linux內核版本號爲2.6.29通過本次實踐,成功實現了Linux系統移植,從而爲後續的Linux應用程序開發及設備驅動程序開發打下了基礎,進而爲ARM的實際工業自動化應用及其他應用打開一個良好的開端。

           

嵌入式系統是以應用爲中心,軟硬件可以裁剪,對功能、可靠性、成本、體積、功耗有嚴格的要求的系統。嵌入式系統的設計開發主要涉及嵌入式微處理器和嵌入式操作系統。處理器的選擇是嵌入式系統的基礎。目前,市場上的CPU種類繁多,包括X86系列、ARM系列、MIPS系列及其他一些專用的CPU,本文采用的CPUARM系列的S3C2440,它是三星的一款基於ARM920T內核開發的32嵌入式處理器,爲手持設備和其它嵌入式應用提供了低功耗、低價格、高性能微控制器的解決方案

操作系統也是嵌入式系統的重要組成部分。目前的嵌入式操作系統有WindowsCELinuxuClinuxuC/OS-IIVxworks等,每種操作系統都有其各自的優點。本文選用的是現在比較流行應用廣泛的Linux系統。它是以Unix爲基礎發展起來的一款開源的操作系統,是真正的多用戶、多任務操作系統,具有極強的平臺可伸縮性、豐富的圖形用戶界面及強大的網絡功能。再加上它提供了強大的管理功能,因此,Linux系統非常適於嵌入式系統開發

        
  1. 系統引導程序及移植

    1. 構建交叉編譯環境

                     

     嵌入式Linux的開發環境可以是PC機上直接安裝Linux,也可以是Windows下在虛擬機上安裝Linux。本文的實驗環境是在Windows7下使用虛擬機安裝RedHat Linux操作系統,主機與目標板的鏈接主要是通過USB口、串口、並口、以太網口建立聯繫的。PC機一般稱爲主機,目標板稱爲目標機。

在移植前首先要先構建交叉編譯環境。交叉編譯環境是指利用運行在機器上的編譯器編譯某個源程序,生成在另一臺機器上運行的目標代碼的過程[5]。主要的開發工具包括三個部分:arm-linux-gcc,arm-linux-objdump,arm-linux-readelf。其中arm-linux-gcc是編譯工具,arm-linux-objdump是反彙編工具,arm-linux-readelfELF文件查看工具。

將已經製作好的交叉編譯工具的安裝包arm-linux-gcc-4.3.2.tar.gz通過vmwaretools工具從windows下掛載到Linux下的/mnt/hgfs/目錄下,執行命令[root@localhosthgfs]# tar xvzf arm-linux-gcc-4.3.2.tar.gz -C /opt,將交叉編譯工具解壓到/opt,然後修改/etc/profile這個配置文件,通過vim編輯器進入文件中,添加export PATH=$PATH:/usr/local/arm/4.3.2/bin,最後關鍵的一步是執行source  /etc/profile,完成交叉編譯環境的安裝。


      

         2.bootloader引導程序及移植

引導加載程序是系統加電後運行的第一段代碼,類似於PC機上的BIOS,它包括固化在固件(fireware)中的boot代碼和bootloader兩大部分。通過這段程序,可以初始化硬件設備、建立內存空間的映射圖、爲最終調用操作系統內核作好準備。Bootloader是依賴於硬件實現的,因此在嵌入式操作系統中建立一個通用的Bootloader是不可行的。大多數Bootloader都分爲stage1stage2兩大部分。依賴於cpu體系結構的代碼,比如設備初始化代碼等,通常都放在stage1中,而且通常都是彙編語言來實現,以達到短小精悍的目的。而stage2則通常用c語言來實現,這樣可以實現更復雜的功能,而且代碼會具有更好的可讀性和克移植性[2]

Bootloaderstage1上電啓動後通常按以下步驟執行:首先初始化硬件設備,如:CPU內部寄存器、內存等。然後是爲加載Bootloaderstage2準備RAM空間,接着拷貝Bootloaderstage2RAM空間中,然後設置好堆棧,最後跳轉到stage2c入口點。

Bootloaderstage2通常按以下步驟執行:初始化本階段要使用的硬件設備,如:串口、網卡等,然後將內核映像和根文件系統映像從flash上讀到RAM空間中,最後調用內核。

U-boot是一種通用引導程序,能夠支持像ARM,X86,XS-cale等多個處理器系列,支持LinuxVxwork等多個嵌入式操作系統,具有可靠性和穩定性強的特點,擁有豐富的設備驅動源代碼,擁有強大的網絡支持和大量的開發調試文檔。U-boot作爲一種源碼開放的引導程序,源代碼採用模塊化編程,能夠很好的在各種硬件平臺上實現方便移植。本文選用的是GT2440開發板作爲Linux操作系統移植的硬件平臺,完成U-boot的移植的步驟如下:

1.在頂層的Makefile中爲開發板添加新的配置選項[4]

2.board目錄中創建一個屬於新開發板的目錄,並添加文件:

         mkdir  -p  board/gt2440

         cp -rf   board/smkd2440 board/gt2440

3.爲開發板添加新的配置文件,先複製參考開發板的配置文件,再修改。

        cp  include/configs/smdk2440.h   include/configs/gt2440.h

4.配置開發板:

make  gt2440_config具體的配置需要根據自己的開發板硬件資源的功能和應用作選擇。

5.編譯U-boot

make CROSS_COMPILE= arm-linux-,編譯成功可以得到U-boot映像。

6.U-boot映像通過JTAG燒寫的到GT2440開發板的NANDFlash的根文件分區中。

  1. 嵌入式linux系統移植

    1. 配置編譯內核文件

      將Linux源碼linux-2.6.29.tar.gz通過vmwaretools工具從windows下掛載到Linux下的/mnt/hgfs/目錄下,執行命令[root@localhosthgfs]# tar xvzf   linux-2.6.29.tar.gz -C / 解壓到你指定的目錄。接下來配置步驟如下:

1.清除原有的配置與中間文件:make  distclean

2.配置內核:make menuconfig ARCH=arm 具體的內核配置應根據硬件平臺和應用需要進行選擇

3.編譯內核:make Image ARCH=arm CROSS_COMPILE= arm-linux-

編譯成功後會在arch/<cpu>/boot/目錄下看到uImage內核

    1. Linux內核的移植

連接並啓動開發板,通過setenv命令設置ethaddr, ipadder, serverip等參數,再通過saveenv命令保存設置。其中ethaddr是網卡地址,ipadder是開發板的ip地址,serveriptftp服務器的地址。

最後把目錄下的uImage通過tftp讀入到起始地址爲0nandflash[5]U-boottftp 22200000 uImage

U-bootnand write 22200000 0 200000

    1. 根文件系統的製作

根文件系統是Linux啓動時使用的第一個文件系統。沒有根文件系統,Linux將無法正常啓動。根文件系統由一系列目錄組成,目錄中包含了應用程序,c庫,以及相關的配置文件。通過如下步驟製作根文件系統

1.創建根文件系統的目錄:

mkdir  rootfs

cd   rootfs

mkdir  bin  dev  etc lib  proc sbin  sys  usr  mnt  tmp var

mkdir  usr/bin   usr/lib   usr/sbin  lib/modules

2.創建設備文件:

cd  dev                              /先進入cdev目錄

   mknod   -m 666 console c 5 1

   mknod   -m 666 null c 1 3

注意Linux系統正常啓動必須要有這兩個設備文件

3.安裝/etc:

tar etc.tar.gz -C /XXX/rootfs

etc目錄下放置了很多的配置文件,包括與系統啓動、關閉有關的配置文件,這些配置 文件非常重要,沒有它,系統不能正常啓動。

4.編譯內核模塊:進入Linux內核目錄

make modules ARCH=arm CROSS_COMPILE= arm-linux

5.安裝內核模塊

make modules_install ARCH=arm INSTALL_MOD_PATH=/XXX/rootfs

實際上安裝內核模塊就是把它從內核代碼拷貝到指定的位置。

6.配置busybox    具體的配置需要根據自己的應用需求選擇

7.編譯安裝busybox:

  make ARCH=arm CROSS_COMPILE= arm-linux-

make install

  busybox是嵌入式開發中的瑞士軍刀:小巧、功能強大,提供了幾乎所有你需要的命令。

然後使用mkyaffs2image工具(同時也是一個命令)製作成映像文件rootfs.yaffs(注意此處是製作成適合於NandFlashyaffs型根文件系統),並將其通過串口下載到NandFlash的根文件分區中。

最後,利用終端仿真程序DNWBootloader引導程序通過串口把內核鏡像uImage下載到GT2440S3C2440上。完成後重新啓動開發板,通過超級終端可以看到系統正常啓動。這時,就可以像在虛擬機上操作安裝的Linux系統一樣,可以在超級終端上輸入命令,來控制目標板(GT2440)上的移植的Linux系統。


3.結束語

本文結合嵌入式Linux系統和GT2440平臺,研究並實現了Linux操作系統向S3C2440平臺的移植,成功搭建了基於ARM9的嵌入式系統開發平臺,這對嵌入式Linux的開發有很大的幫助,爲後續的驅動器程序和應用程序的開發也奠定了基礎。構建嵌入式系統是一項比較複雜的過程,其系統的穩定性,安全性,可靠性等都要使用者詳細考慮。雖然本文嵌入式系統的構建是建立在Linux操作系統和S3C2440目標板上的,但是對於其他的操作系統和目標板來說,其原理是一樣的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章