新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 構建嵌入式linux平臺下的用戶應用

        構建嵌入式linux平臺下的用戶應用

        作者: 時間:2012-02-16 來源:網絡 收藏

        1.引言

        本文引用地址:http://www.104case.com/article/149656.htm

        在專用的板子運行 GNU/Linux 系統已經變得越來越流行。一個 Linux 系統從軟件的角度看通常可以分為四個層次,如圖1-1所示:

        (1)引導程序。包括固化在固件(firmware)中的 boot 代碼(可選),和 Boot Loader 兩大部分。

        (2)Linux 內核。針對于板子的定制內核以及內核的啟動參數。

        (3)文件系統。包括根文件系統和建立于 Flash 內存設備之上文件系統。通常用 ram disk 來作為根文件系統

        (4)程序。特定于程序。有時在程序和內核層之間可能還會包括一個嵌入式圖形用戶界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 。

        下面就在-2.4.x內核上如何正確組織、連接這幾個部分來自動運行用戶應用程序進行分析。

        2.的啟動過程

        在系統復位后首先遠行的程序就是引導程序(Boot loader)。 引導程序可以放在專用的ROM中,也可以和內核影像、文件系統影像共用閃存芯片或固態硬盤如下圖所示。引導程序首先負責初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。Uboot是Sourceforge上的一個開源的引導程序,提供了對PowerPC(MPC5xx、MPC8xx、MPC82x、MPC7xx、MP74xx、4xx)、ARM(ARM7、ARM9、StrONgArm、Xsacle)、MIPS、x86等處理器的支持。下載站點是http://sourceforge.net/projects/u-boot

        U-boot在ARM9系統啟動流程:

          1、跳轉到reset代碼(將CPU設置成SVC,ARM工作模式,SDRAM初始化)

          2、將U-boot代碼拷貝到RAM空間。可以調用C函數

          3、調用初始化函數

          (CPU_init(),board_init(),interrupt_init(),serial_init())

          4、初始化flash設備

          5、初始化系統內存分配函數

          6、初始化NAND設備

          7、初始化顯示設備

          8、初始化網絡設備

          9、進入命令循環,接收用戶從串口傳來的命令,如果延時10秒鐘無用戶操作則自動加載內核。首先將linux內核影像(kernel Image)拷貝到ram空間,然后跳轉到linux內核代碼的第一條指令處,將控制權交給linux內核。

        3. 掛接自己的嵌入式文件系統

        3.1. 嵌入式文件系統的層次結構

        嵌入式文件系統的任務是對文件進行管理,其工作包括提供對邏輯文件的操作(包括檢索、新增、修改、刪除、拷貝)接口,方便用戶操作文件和目錄。文件系統內部,則根據存儲設備的特點,使用不同的文件組織模式來實現文件的邏輯結構,比如磁帶中使用的順序文件以及大多數操作系統使用的樹狀文件。此外文件系統也管理文件的安全性、完整性以及多進程訪問控制。文件系統不能實現對物理設備的直接控制,對物理設備的訪問是通過MTD/FTL層實現的。MTD/FNL層向上將閃存設備抽象成邏輯設備(邏輯頁面和塊),為文件系統提供對物理設備操作接口;向下實現對閃存設備的讀寫、清零、ECC校驗等工作。在linux系統中實現了對閃存操作的底層函數。下圖給出了文件系統的層次關系。

        3.2. 幾種針對閃存的嵌入式文件系統的比較

        3.3. 掛接JFFS2文件系統

        (1) 修改設備號

        由于ROM設備和MTDBlock設備的主設備號(major)都是31,所以如果你不想把JFFS2作為根文件系統的話,必須修改他們之一的major。如果你要修改JFFS2的設備major,在/linux-2.4.x/include/linux/mtd/mtd.h中把

        #define MTD_BLOCK_MAJOR 31

        改成

        #define MTD_BLOCK_MAJOR 30

        (2) 編寫Maps文件

        添加在flash上的map文件。在/kernel/drivers/mtd/maps下添加flash(如intel NOR型28f128j3a)的map。

        (3) 將配置加入/kernel/drivers/mtd/maps/Config.in中

        dep_tristate ' CFI Flash device mapped on S3C2410' CONFIG_MTD_S3C2410 $CONFIG_MTD_CFI

        (4) 配置內核使其支持jffs2。

        這里要特別注意Memory Technology Devices (MTD)的選項支持及其子項

        RAM/ROM/Flash chip drivers --->

        Mapping drivers for chip access --->

        的選項支持;

        還有File systems下選項支持。

        具體的配置選擇請參考附錄1

        (5) 制作jffs2映象

        首先取得jffs2的制作工具:mkfs.jffs2(可從網上取得)

        執行如下命令即可生成所要的映象:

        chmod 777 mkfs.jffs2 //取得mkfs.jffs2的執行權限,即mkfs.jffs2成為可執行文件

        ./mkfs.jffs2 -d jffs2/ -o jffs2.img //生成jffs2文件映象,其中目錄jffs2可以是任意的目錄,這里的jffs2是我新建的一個目錄

        (6) Jffs2的下載

        燒寫完引導程序(boot loader)、內核影像(zImage)、根文件系統(ramdisk.image.gz)之后,接著燒寫jffs2.img,具體燒寫如下:

        tftp 30800000 jffs2.img

        fl 1800000 30800000 20000 (其中20000可根據jffs2的大小適當調整,理論上只要比jffs2.img略大即可,但要為20000的整數倍。1800000是Jffs2在閃存中的起始位置,3800000是將jffs2.img下載到內存中的位置)

        (7) 在根文件系統上自動掛接Jffs2

        在ramdisk.image.gz的mnt/etc/init.d/rc$文件中加入如下指令以便啟動時自動掛載jffs2文件系統。

        Mount -t jffs2 /dev/mtdblock/4 /mnt (其中的/dev/mtdblock/4是flash上的jffs2分區)

        4.啟動用戶應用程序

        在嵌入式應用系統中,往往不需要進入linux的界面(命令行窗口或圖形桌面),而是需要直接啟動專用的用戶程序。下面介紹一種實現方法。

        在制作根文件系統影像(ramdisk.image.gz)前在根目錄下創建myproc目錄,將MyApp應用程序復制到此目錄下。在ramdisk.image.gz的mnt/etc/init.d/rc$文件中加入如下指令以便自動啟動用戶應用程序MyApp。

        #cd /myproc( 進入myproc目錄)

        #./MyApp

        MyApp是一個小的應用程序,它的處理流程如下(其中Mystart假定為用戶最終的應用程序) :

        5. 總結

        Linux 正在嵌入式開發領域穩步發展。因為 Linux 基于 GPL,所以任何對將 Linux 定制于 PDA、掌上機或者工控設備感興趣的人都可以從因特網免費下載其內核和應用程序,并開始移植或開發。目前許多 優秀的Linux 系統可供用戶選擇。它們包括 RTLinux(實時 Linux)、uClinux(用于非 MMU 設備的 Linux)、Montavista Linux(用于 ARM、MIPS、PPC 的商用 Linux 分發版)、ARM-Linux(ARM 上的 Linux)等。利用現有的大量的共享資源,自己的嵌入式linux,開發linux應用已經列入許許多多公司的發展戰略之中。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 花垣县| 阿图什市| 余庆县| 黔西县| 台东市| 延边| 沙洋县| 青阳县| 乐业县| 大名县| 宁河县| 大连市| 嵊泗县| 调兵山市| 包头市| 莱州市| 梨树县| 邢台县| 嘉定区| 逊克县| 福鼎市| 汤原县| 文登市| 湖口县| 张北县| 庄浪县| 肥乡县| 德州市| 灌南县| 新津县| 繁峙县| 大庆市| 正蓝旗| 清新县| 边坝县| 盘山县| 芮城县| 通河县| 庆安县| 广平县| 塘沽区|