uClinux在嵌入式系統(tǒng)中的移植研究
c,=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內(nèi)核的修改 目前uClinux已被成功移植到S3C44B0及其他多款A(yù)RM芯片上,但由于嵌入式操作系統(tǒng)的運(yùn)行是與嵌入式系統(tǒng)的硬件密切相關(guān)的,而硬件的設(shè)計(jì)則會因?yàn)槭褂脠龊系牟煌Р钊f別,因此,uClinux內(nèi)核源代碼中和硬件緊密相關(guān)的部分就應(yīng)該針對特定的硬件作出適當(dāng)?shù)男薷摹? 首先,從網(wǎng)站(www.uClinx.org)下載源碼uClinux-dist-20040408,但這個(gè)發(fā)行包中的內(nèi)核對S3C44B0X處理器的支持是不完整的,必須為內(nèi)核打上補(bǔ)丁uClinux-2.4.24.patch(可以從http://www.hzlitai.com.cn下載),然后在終端下執(zhí)行:patch –p0 -2.4.24.patch就可以安裝該補(bǔ)丁。該補(bǔ)丁完善了對S3C44B0的支持,但是它針對特定的硬件及Bootloader,對內(nèi)核做了相應(yīng)的修改,因此我們在做移植時(shí)應(yīng)該根據(jù)自己的BootLoader及硬件來修改內(nèi)核。修改部分如下: (1)壓縮內(nèi)核代碼起始地址修改 修改目錄linux-2.4.x/arch/armnommu/boot/下的文件Makefile里的如下代碼: ifeq ($(CONFIG_BOARD_MBA44),y) ZTEXTADDR = 0x0c300000 ZRELADDR = 0x0c008000 Endif ZTEXTADDR代表 映像文件image.rom自解壓的起始地址,它的值是由BootLoader的功能2決定的。執(zhí)行功能2,將image.rom從Flash轉(zhuǎn)移到SDRAM的地址0x0c300000,內(nèi)核自解壓,所以ZTEXTADDR必須和這個(gè)值相同。ZRELADDR代表內(nèi)核解壓后代碼輸出起始地址。 (2)處理器配置選項(xiàng)的修改 修改目錄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的大小,F(xiàn)LASH_MEM_BASE代表Flash的起始地址, FLASH_SIZE代表Flash的大小。要根據(jù)自己的Flash和SDRAM來設(shè)定這些值 (3)內(nèi)核起始地址的修改 修改目錄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代表內(nèi)核起始地址,與image.rom自解壓后代碼輸出起始地址(ZRELADDR)相同。 ?。?)ROM文件系統(tǒng)的定位修改 修改目錄linux-2.4.x/drivers/block下的文件blkmem.c里的如下代碼: #ifdef CONFIG_BOARD_MBA44 , #endif 0x00100000是文件系統(tǒng)的定位地址。本文中移植采用uClinux的文件系統(tǒng)ROM file sy stem,它的映象文件romfs.img要燒寫到flash的某一地址。一旦該定位地址確定,在執(zhí)行BootLoader的功能1時(shí)就要將romfs.img燒寫到flash的這個(gè)地址。定位地址不是固定不變的,可以根據(jù)flash和image.rom的大小來更改。 ?。?)定義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啟動后,一旦發(fā)生中斷,處理器會自動跳轉(zhuǎn)到從0x0地址開始的第一級中斷向量表中的某個(gè)表項(xiàng),再跳轉(zhuǎn)到從vectors_base()開始的uClinux異常中斷向量表中的某個(gè)表項(xiàng),執(zhí)行中斷服務(wù)程序。 (6)定義CPU體系結(jié)構(gòu)和交叉編譯器 修改目錄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的體系結(jié)構(gòu),S3C44B0采用的內(nèi)核為無內(nèi)存管理單元的ARM7TDMI,所以體系結(jié)構(gòu)定義為armnommu。CROSS_COMPILE = arm-elf-定義了交叉編譯器名稱,這里采用的交叉編譯器為Arm-elf-tools-20030314.sh,所以名稱定義為arm-elf-。 3.4交叉編譯環(huán)境的建立 由于 Bootloader在物理上獨(dú)立于uClinux, 可以在集成開發(fā)環(huán)境下(如ADS)開發(fā),但是uClinux必須在GNU環(huán)境下實(shí)現(xiàn)。Arm-elf-tools-20030314.sh是一個(gè)針對arm的交叉編譯器,在Linux操作系統(tǒng)下安裝這個(gè)編譯器,能夠編譯運(yùn)行于ARM 上的程序。在Linux環(huán)境下,從網(wǎng)站(如http://www.uClinux.org)下載Arm-elf-tools-20030314.sh。將其考到任何一個(gè)目錄下,然后執(zhí)行sh ./ arm-elf-tools-20030314.sh 這樣,交叉編譯工具就安裝好了。 3.5 uClinux內(nèi)核的配置,編譯及連接 在編譯uClinux 內(nèi)核之前,首先要對內(nèi)核進(jìn)行配置。用make menuconfig進(jìn)行內(nèi)核的配置,內(nèi)核版本選linux-2.4.x,System Type選 S3C44B0 ARM ,庫函數(shù)版本選uClibc。保存設(shè)置會出現(xiàn)內(nèi)核配置窗口和用戶程序配置窗口,內(nèi)核配置中選擇ROM文件系統(tǒng)支持和S3C44B0串口支持,用戶配置按默認(rèn)選項(xiàng)(可以根據(jù)自己的需要對內(nèi)核和用戶程序進(jìn)行配置)。 配置完成后,開始編譯內(nèi)核,在終端分別執(zhí)行make dep,make lib_only,make user_only,make romfs,make image,make。當(dāng)內(nèi)核的編譯工作完成后,在目錄uClinux/images下會生成我們需要的映像文件image.rom,image.ram,romfs.img。 3.6 uClinux內(nèi)核的下載與執(zhí)行 使用fluted 工具將 Bootloader 燒寫到 flash 的0X000000處;利用 Bootloader 將內(nèi)核映像image.rom 下載到0x10000處;利用Bootloader 將文件系統(tǒng)romfs.img下載到0x1000 00處.啟動uClinux就可以在超級終端看到uClinux 的歡迎信息和簡單的shell提示符。 4 結(jié)束語 對于嵌入式系統(tǒng)開發(fā)人員來說 ,要將嵌入式操作系統(tǒng)應(yīng)用到嵌入式系統(tǒng)中,首先要做的工作是根據(jù)不同的硬件平臺移植操作系統(tǒng),掌握移植的方法非常重要。本文所述的移植方法已經(jīng)成功應(yīng)用于多個(gè)項(xiàng)目的開發(fā)。所述的移植雖然是針對ARM處理器芯片S3C44B0,但重點(diǎn)闡述的是移植的思路和方法,對將uClinux移植到其他處理器為核心的硬件平臺也有借鑒作用。 參考文獻(xiàn): [1] 李巖,榮盤. 基于S3C44B0嵌入式uClinux系統(tǒng)原理及應(yīng)用[M] .北京:清華大學(xué)出版社,2005 [2] 楊瑞亞 ,肖 璋. 嵌入式 uCLinux 內(nèi)核啟動過程分析與設(shè)計(jì) [J]. 微計(jì)算機(jī)信息,2005,21(8-2):32-33 [3] Daniel P.Bovet &Marco Cesati. 深入理解Linux內(nèi)核[M]. 北京:中國電力出版社,2004 |