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


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内核的修改
  目前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
  ,
  #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

COPYRIGHT(C) 2011 厦门永宏亚得机电科技有限公司版权所有(闽ICP备05025945号) ALL RIGHTS RESERVED?

电话: 0592-5190891 传真: 0592-5190720 E-Mail: E-mail:yade8895@163.com
地址: 厦门市海沧区兴港六里17号2607室 邮编:361009 联系人:翟先生