1. gzyueqian
      18078865874
      首頁 > 新聞中心 > > 正文

      uClinux在嵌入式系統中的移植研究

      更新時間: 2007-06-26 13:09:01來源: 粵嵌教育瀏覽量:898

        uClinux作為Linux衍生操作系統,具有支持多任務、內核精簡、高效、穩定和源代碼開放等優點,專門應用于無MMU微處理器的嵌入式系統[1]。
       
      1 引言

        將uClinux應用于嵌入式系統已經成為許多嵌入式開發人員的選擇。本文針對基于三星公司生產的ARM系列微處理器S3C44B0的硬件平臺,詳細論述移植uClinux 的過程,主要包括BootLoader的設計, uClinux內核的修改,交叉編譯環境的建立,uClinux內核的配置,編譯及連接,映像文件的下載及運行。
        
      2 硬件環境
        
        硬件平臺以S3C44B0為核心,采用的外部晶振頻率為10MHz,內核主頻可達到64MHz;通過RS232接口與上位機通訊;外接JTAG接口,支持在線調試;采用SST39VF1601(2M字節)作為程序存儲器,對應的地址空間為0x00000000-0x001fffff;采用HY57VF641620 (8M 字節)作為數據存儲器, 對應的地址空間為0x0c000000-0x0c7fffff。硬件框圖如圖1所示。


      圖 1 硬件框圖

      3 uClinux的移植
        
      3.1 移植思路
        
        硬件環境確定以后,首先,要為uClinux設計一個BootLoader,通過BootLoader來初始化硬件,引導uClinux運行。Bootloader設計可以在ads中實現。然后,針對硬件環境,和設計的BootLoader修改uClinux內核。接下來,在Linux操作系統下建立編譯uClinux的交叉編譯環境。,配置、編譯、連接uClinux,下載編譯得到的映像文件到Flash,通過BootLoader來啟動uClinux。
        
      3.2 Bootloader的設計
        
        BootLoader就是在操作系統內核運行之前運行的一段小程序.通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為終轉到操作系統內核準備好合適的環境.這里設計的BootLoader主要有啟動、下載和燒寫引導uClinux的功能。BootLoader完成初始化工作后會通過串口在Windows的終端顯示如下信息:0: tftp download 1: Write NorFlash with download file 2: Boot uClinux
        
        在終端的提示符“/”下輸入0、1或2分別代表選擇功能0、功能1或 功能2。BootLoader執行對應的操作,功能0利用TFTP網絡傳輸程序到SDRAM,默認下載地址為0x0c000800;功能1下載程序到flash,uClinux的映像文件image.rom的下載地址為0x00010000, Romfs.img的下載地址為0x00100000。這兩個下載地址不是任意的,前一個地址與BootLoader的功能2有關;后一個地址與uClinux的文件系統定位有關。具體確定方法在下文論述;功能2啟動燒寫到Flash的uClinux。[2]
        
        因為本文的重點是uClinux的移植,所以這里不再詳述BootLoader的具體實現過程,只介紹一下與uClinux相關的地方:

        (1)因為uClinux要利用S3C44B0的串口輸出一些信息,所以BootLoader初始化過程中要設定處理器的主頻,uClinux根據這個主頻來設定串口寄存器,得到一定數值的波特率。本文選擇的主頻為61Mhz,波特率為115200。

        (2)執行功能2時,會調用一個MoveRun函數:
        
        Void MoveRun(void)
        {void (*fp)(U32,U32)=(void(*)(U32,U32))0xc300000; //0xc300000為uClinux的運行地址
        NorFlashRead(0xc300000,0x10000,0x160000) ; //將燒寫到0x10000處的image.rom移到//0xc300000
        (*fp)(0, 0); //啟動uClinux
        }

        (3) 啟動uClinux后,image.rom在0xc300000處自解壓,并在0x0c000000處放置uClinux 的中斷向量表。即使uClinux 內核已經得到處理器的控制權運行,一旦發生中斷,處理器還是會自動跳轉到從0x0地址開始的級中斷向量表中的某個表項(依賴于中斷類型)處讀取指令運行。所以在編寫BootLoader時,地址0x0處的一級異常中斷矢量表只需簡單地包含向0x0c000000處的中斷向量表的跳轉指令就可以,這樣就 能夠正確地將發生的事件交給uClinux的中斷處理程序來處理,BootLoader的級異常中斷向量表如下所示:
        b ResetHandler ;//跳轉到初始化部分
        ldr pc,=0x0c000004; // Undefined Instruction Handler
        ldr pc,=0x0c000008; // Software Interrupt Handler
        ldr pc,=0x0c00000c; // Prefetch Abort Handler
        ldr pc,=0x0
      c000010; // Data Abort Handler
        b .
        ldr pc,=0x0c000018; //IRQ Handler
        ldr pc,=0x0c00001c; //FIQ Handler
        
      3.3 uClinux內核的修改
        
        目前uClinux已被成功移植到S3C44B0及其他多款ARM芯片上,但由于嵌入式操作系統的運行是與嵌入式系統的硬件密切相關的,而硬件的設計則會因為使用場合的不同而千差萬別,因此,uClinux內核源代碼中和硬件緊密相關的部分就應該針對特定的硬件作出適當的修改。
        
        首先,從網站(www.uClinx.org)下載源碼uClinux-dist-20040408,但這個發行包中的內核對S3C44B0X處理器的支持是不完整的,必須為內核打上補丁uClinux-2.4.24.patch(可以從http://www.hzlitai.com.cn下載),然后在終端下執行:patch –p0 -2.4.24.patch就可以安裝該補丁。該補丁完善了對S3C44B0的支持,但是它針對特定的硬件及Bootloader,對內核做了相應的修改,因此我們在做移植時應該根據自己的BootLoader及硬件來修改內核。修改部分如下:
        
        (1)壓縮內核代碼起始地址修改
        
        修改目錄linux-2.4.x/arch/armnommu/boot/下的文件Makefile里的如下代碼:
        ifeq ($(CONFIG_BOARD_MBA44),y)
        ZTEXTADDR = 0x0c300000
        ZRELADDR = 0x0c008000
        Endif
        ZTEXTADDR代表 映像文件image.rom自解壓的起始地址,它的值是由BootLoader的功能2決定的。執行功能2,將image.rom從Flash轉移到SDRAM的地址0x0c300000,內核自解壓,所以ZTEXTADDR必須和這個值相同。ZRELADDR代表內核解壓后代碼輸出起始地址。
        
        (2)處理器配置選項的修改
        
        修改目錄linux-2.4.x/arch/armnommu/下的文件config.in里的如下代碼:
        define_int CONFIG_ARM_CLK 64000000
        if [ "$CONFIG_SET_MEM_PARAM" = "n" ]; then
        define_hex DRAM_BASE 0x0C000000
        define_hex DRAM_SIZE 0x00800000
        define_hex FLASH_MEM_BASE 0x00000000
        define_hex FLASH_SIZE 0x00200000
        
        DRAM_BASE代表SDRAM的起始地址,DRAM_SIZE代表SDRAM的大小,FLASH_MEM_BASE代表Flash的起始地址, FLASH_SIZE代表Flash的大小。要根據自己的Flash和SDRAM來設定這些值

        (3)內核起始地址的修改
        
        修改目錄linux-2.4.x/arch/ARMnommu/下的文件Makefile里的如下代碼:

        ifeq ($(CONFIG_BOARD_MBA44),y)
        TEXTADDR = 0x0c008000
        MACHINE = S3C44B0X
        INCDIR = $(MACHINE)
        CORE_FILES := $(CORE_FILES) #romfs.o
        Endif
        TEXTADDR代表內核起始地址,與image.rom自解壓后代碼輸出起始地址(ZRELADDR)相同。
        
        (4)ROM文件系統的定位修改
        
        修改目錄linux-2.4.x/drivers/block下的文件blkmem.c里的如下代碼:
        #ifdef CONFIG_BOARD_MBA44
        {0, 0x00100000, -1},
        #endif
        
        0x00100000是文件系統的定位地址。本文中移植采用uClinux的文件系統ROM file sy
      stem,它的映象文件romfs.img要燒寫到flash的某一地址。一旦該定位地址確定,在執行BootLoader的功能1時就要將romfs.img燒寫到flash的這個地址。定位地址不是固定不變的,可以根據flash和image.rom的大小來更改。
        
        (5)定義uClinux異常中斷向量表的起始地址
        修改目錄linux-2.4.x/include/asm-armnommu/proc/下的文件system.h 里的如下代碼:
        #ifdef CONFIG_BOARD_MBA44
        #undef vectors_base()
        #define vectors_base() (0x0c000000)
        #endif
        
        vectors_base()定義了uClinux異常中斷向量表的起始地址 。uClinux啟動后,一旦發生中斷,處理器會自動跳轉到從0x0地址開始的級中斷向量表中的某個表項,再跳轉到從vectors_base()開始的uClinux異常中斷向量表中的某個表項,執行中斷服務程序。
        
        (6)定義CPU體系結構和交叉編譯器
        
        修改目錄linux-2.4.x/下的文件Makefile里的如下代碼:
        KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
        ARCH := armnommu
        HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
         CROSS_COMPILE = arm-elf-
        
        ARCH := armnommu定義了CPU的體系結構,S3C44B0采用的內核為無內存管理單元的ARM7TDMI,所以體系結構定義為armnommu。CROSS_COMPILE = arm-elf-定義了交叉編譯器名稱,這里采用的交叉編譯器為Arm-elf-tools-20030314.sh,所以名稱定義為arm-elf-。
        
      3.4交叉編譯環境的建立
        
        由于 Bootloader在物理上獨立于uClinux, 可以在集成開發環境下(如ADS)開發,但是uClinux必須在GNU環境下實現。Arm-elf-tools-20030314.sh是一個針對arm的交叉編譯器,在Linux操作系統下安裝這個編譯器,能夠編譯運行于ARM 上的程序。在Linux環境下,從網站(如http://www.uClinux.org)下載Arm-elf-tools-20030314.sh。將其考到任何一個目錄下,然后執行sh ./ arm-elf-tools-20030314.sh 這樣,交叉編譯工具就安裝好了。
        
      3.5 uClinux內核的配置,編譯及連接
        
        在編譯uClinux 內核之前,首先要對內核進行配置。用make menuconfig進行內核的配置,內核版本選linux-2.4.x,System Type選 S3C44B0 ARM ,庫函數版本選uClibc。保存設置會出現內核配置窗口和用戶程序配置窗口,內核配置中選擇ROM文件系統支持和S3C44B0串口支持,用戶配置按默認選項(可以根據自己的需要對內核和用戶程序進行配置)。
        
        配置完成后,開始編譯內核,在終端分別執行make dep,make lib_only,make user_only,make romfs,make image,make。當內核的編譯工作完成后,在目錄uClinux/images下會生成我們需要的映像文件image.rom,image.ram,romfs.img。

      3.6 uClinux內核的下載與執行
        
        使用fluted 工具將 Bootloader 燒寫到 flash 的0X000000處;利用 Bootloader 將內核映像image.rom 下載到0x10000處;利用Bootloader 將文件系統romfs.img下載到0x1000
        00處.啟動uClinux就可以在超級終端看到uClinux 的歡迎信息和簡單的shell提示符。
        
      4 結束語
        
        對于嵌入式系統開發人員來說 ,要將嵌入式操作系統應用到嵌入式系統中,首先要做的工作是根據不同的硬件平臺移植操作系統,掌握移植的方法非常重要。本文所述的移植方法已經成功應用于多個項目的開發。所述的移植雖然是針對ARM處理器芯片S3C44B0,但重點闡述的是移植的思路和方法,對將uClinux移植到其他處理器為核心的硬件平臺也有借鑒作用。
        
      參考文獻:
        
      [1] 李巖,榮盤. 基于S3C44B0嵌入式uClinux系統原理及應用[M] .北京:清華大學出版社,2005
      [2] 楊瑞亞 ,肖 璋. 嵌入式 uCLinux 內核啟動過程分析與設計 [J]. 微計算機信息,2005,21(8-2):32-33
      [3] Daniel P.Bovet &Marco Cesati. 深入理解Linux內核[M]. 北京:中國電力出版社,2004

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲资源在线播放站 | 亚洲va国产va欧美 | 亚洲综合一区二区精品久久 | 乱子伦国产对白在线播放 | 日韩国产变态另类欧美 | 在线观看亚州精品 |