uClinux在嵌入式系統(tǒng)中的移植研究
3.3 uClinux內核的修改
目前uClinux已被成功移植到S3C44B0及其他多款ARM芯片上,但由于嵌入式操作系統(tǒng)的運行是與嵌入式系統(tǒng)的硬件密切相關的,而硬件的設計則會因為使用場合的不同而千差萬別,因此,uClinux內核源代碼中和硬件緊密相關的部分就應該針對特定的硬件作出適當的修改。
首先,從網站(www.uClinx.org)下載源碼uClinux-dist-20040408,但這個發(fā)行包中的內核對S3C44B0X處理器的支持是不完整的,必須為內核打上補丁uClinux-2.4.24.patch(可以從http://www.hzlitai.com.cn下載),然后在終端下執(zhí)行:patch –p0uClinux
-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決定的。執(zhí)行功能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文件系統(tǒng)的定位修改
修改目錄linux-2.4.x/drivers/block下的文件blkmem.c里的如下代碼:
#ifdef CONFIG_BOARD_MBA44
{0, 0x00100000, -1},
#endif
0x00100000是文件系統(tǒng)的定位地址。本文中移植采用uClinux的文件系統(tǒng)ROM file system,它的映象文件romfs.img要燒寫到flash的某一地址。一旦該定位地址確定,在執(zhí)行BootLoader的功能1時就要將 romfs.img燒寫到flash的這個地址。定位地址不是固定不變的,可以根據flash和image.rom的大小來更改。
矢量控制相關文章:矢量控制原理
評論