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

发布者:心语乐章最新更新时间:2012-05-21 来源: 微计算机信息 关键字:嵌入式系统  uClinux  移植 手机看文章 扫描二维码
随时随地手机看文章

1 引言

uClinux作为Linux衍生操作系统,具有支持多任务、内核精简、高效、稳定和源代码开放等优点,专门应用于无MMU微处理器的嵌入式系统[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,=0x0c000010;   // Data Abort Handler

b .

ldr pc,=0x0c000018;    //IRQ Handler

ldr pc,=0x0c00001c;    //FIQ Handler[page]

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 system,它的映象文件romfs.img要烧写到flash的某一地址。一旦该定位地址确定,在执行BootLoader的功能1时就要将 romfs.img烧写到flash的这个地址。定位地址不是固定不变的,可以根据flash和image.rom的大小来更改。[page]

(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

关键字:嵌入式系统  uClinux  移植 引用地址:uClinux在嵌入式系统中的移植研究

上一篇:uClinux操作系统的实时化分析与研究
下一篇:基于嵌入式Web服务器的温室远程监控的研究

推荐阅读最新更新时间:2024-05-02 22:04

I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之声卡驱动移植
前面的文章简单的讲述了字符设备驱动程序的编写,用字符设备驱动的方式实现了按键驱动,但是,出了我们的自己编写的针对我们的这个驱动程序的应用程序之外,其他应用程序都无法接收我们这个驱动的键值输入,为了让所有应用程序都可以接收我们的按键驱动解析的键值,Linux内核定义了“输入子系统”的概念,也就是说,只要我们按照这个模型进行驱动开发,并为其提供必须的接口函数,那么,Linux内核就可以正常来获取我们的键盘值了。 输入子系统的原理分析强烈推荐观看韦东山老师的视频讲座,讲的非常清楚,我这里是按照输入子系统的方式实现的按键驱动,下面是源码,放在这里做个备份: #include linux/types.h #include linu
[单片机]
嵌入式系统开源软件的回顾和展望
  回顾过去20年嵌入式系统在国内各行各业蓬勃发展,其中有两项重要技术对此贡献很大:一是ARM,二是开源软件,尤其是Linux和与Linux相关的开源软件。对于ARM,今天业内热议的ARM上网本现在看只是_二个桥头堡。进攻胜利了,ARM即刻大举占领利润丰厚的PC市场,退一步也可以保住自己的移动终端和已经牢牢把握的嵌入式市场。ARM要想成功,必然要仰仗开源软件;指望微软是不行的,微软有太多的历史包袱和既得利益,在windows 7是否支持ARM架构这件事情上一直摇摆不定。另一方面,Linux在经历了漫长和痛苦的桌面市场的博弈之后,发现了移动计算这片领域,开始是智能手机、MID,到现在的上网本(netbook),还有未来的智能本(一种
[嵌入式]
基于ARM嵌入式系统的SPI驱动程序设计
嵌入式系统已被广泛应用于国防电子、数字家庭、工业自动化、汽车电子等多种领域。在嵌入式开发过程中,许多系统通常使用串口驱动来满足通信要求,但在实际应用中,使用SPI通信方式会更加高效和快捷。SPI接口是一种高速、高效的串行接口技术,因而SPI设备在数据通信应用中十分方便。本文基于ARM9芯片的S3C2440和Linux操作系统,设计了一种SPI驱动程序,该驱动程序功能可靠灵活、易于移植,可应用于多种嵌入式平台,实现arm与设备之间的通信。 1 硬件说明 1.1 S3C2440开发平台 采用三星公司的SoC芯片S3C2440 作为核心处理器,主频为400 MHz,并与64 MB SDRAM和64 MB NAND Flash共同组成
[单片机]
利用TF卡进行嵌入式系统开发调试及存储应用的方案
硬件平台基于应用处理器PXA310,软件平台基于嵌入式Linux的Android操作系统。首先介绍了TF卡与应用处理器的连接电路设计。然后介绍TF卡驱动程序的设计和Android对TF卡的挂载方法。在TF卡驱动程序设计中采用了SPI工作模式和FAT32文件系统,描述了FAT32文件系统的移植。最后介绍了系统调试,并展示了TF卡在视频数据采集单元中应用的设计结果。 嵌入式系统调试一般使用串口、JTAG、USB或网卡来下载系统镜像到目标机中。使用串口下载镜像,协议简单,接口通用,但传输速率太慢。使用JTAG下载镜像,传输速率较高,但需要专用的JTAG调试器,价格较高,限制了调试环境。使用USB或网卡下载镜像速度快、接口通用
[单片机]
利用TF卡进行<font color='red'>嵌入式系统</font>开发调试及存储应用的方案
u-boot移植(七)---代码修改---存储控制器
一、CPU访问芯片的条件      CPU通过访问存储控制器,来读取外部设备的数据。   CPU想访问一个芯片,需要如下条件(配置信息): 地址线 数据线:8位/16位/32位数据宽度 时钟/频率  其他芯片相关的特性:比如SDRAM,有行地址、列地址和bank   SDRAM的访问和表格检索的原理一样,先指定一个行(Row),再指定一个列(Columu),就可以准确找到所需要的单元格。这个单元格称为存储单元,这个表格(存储阵列)就是逻辑Bank(Logical Bank,即L-Bank),SDRAM一般含有4个L-bank。        只有配置好了存储管理器,才知道如何去访问外部的设备。 二、存储控制器
[单片机]
u-boot<font color='red'>移植</font>(七)---代码修改---存储控制器
移植linux-2.6.30.4到S3C2440
一、下载linux-2.6.30.4源码,并解压 ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.4.tar.gz tar zxvf linux-2.6.30.4.tar.gz 二、在系统中添加对ARM的支持 $vim Makefile 193#ARCH ?= $(SUBARCH) 194#CROSS_COMPILE ?= 195 ARCH=arm 196 CROSS_COMPILE=arm-linux- 三、修改系统时钟 $vim arch/arm/mach-s3c2440/mach-smdk2440.c 系统的外部时钟为12MHz 160static
[单片机]
ESCRYPT和GlobalSign加入英飞凌安全合作伙伴网络
2016年9月7日,德国慕尼黑讯 英飞凌安全合作伙伴网络(ISPN)迎来新伙伴 ESCRYPT Embedded Security和GlobalSign。两家公司都提供面向工业4.0应用、基于英飞凌OPTIGA 可信平台模块(TPM)的专用安全解决方案。ISPN是一个由领先安全解决方案提供商组成的网络,它们为物联网设备制造商和服务提供商提供基于硬件的安全解决方案。 工业4.0亦称工业互联网,它将嵌入式系统技术与智能生产工艺相结合,以提升总体生产效率。其核心是将工业价值链和生产价值链相连接的智能工厂。智能工厂必须给予其充分保护,因为安全漏洞可能导致间谍活动和知识产权失窃,甚或造成大规模停工。 作为ISPN的成员,ES
[物联网]
ESCRYPT和GlobalSign加入英飞凌安全合作伙伴网络
11-S3C2440驱动学习(五)嵌入式linux-网络设备驱动(二)移植DM9000C网卡驱动程序
我们实现了一个虚拟网卡驱动程序,现在我们针对真实的网卡芯片DM9000C,编写移植DM9000C网卡驱动程序。 一、移植分析 协议类的驱动,我们的主要工作往往是将现有的驱动和我们的硬件所匹配起来。协议类的函数往往已经成型不需要我们去修改和编写。比如发包函数:hard_start_xmit函数和netif_rx上报函数都不需要我们编写。网络驱动是针对很多硬件编写出来的,我们使用的是什么硬件CPU,比如ARM9,以及我们使用的系统版本。我们只需要修改驱动,告诉驱动现在的硬件情况是怎么样的,基地址是多少,中断引脚是哪个、设置下内存管理器以满足时序等等。这也是网络驱动移植的简单之处。 (1)DM9000C 一般一款网卡芯片,出
[单片机]
11-S3C2440驱动学习(五)嵌入式linux-网络设备驱动(二)<font color='red'>移植</font>DM9000C网卡驱动程序
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved