APP下载

嵌入式Linux在s3c2440上的移植

2011-03-17叶培顺

电子设计工程 2011年15期
关键词:开发板驱动程序内核

叶培顺

(榆林学院 信息工程学院,陕西 榆林 719000)

嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统[1]。在嵌入式系统里基于ARM的嵌入式处理已经成为市场主流。而Linux是免费运行的,快速高效的操作系统,在过去的几年中,基于开源组织的Linux系统的嵌入式操作系统得到了长足的发展。Linux操作系统虽然不是微内核结构,但是其模块化的结构使得用户可以对其方便的进行配置,去除用户系统不需要的模块,减小系统的开销可以做到几百K大小。

本文所讨论嵌入式系统目标平台采用的是Samsung公司基于ARM 920T内核开发的一款嵌入式处理器S3C2440,用于PDA、Internet设备和手持设备,内部集成了LCD、USB等控制器。Linux内核采用2.6版本的内核,它吸收了一些新技术,在性能,可量测性支持和可用性方面有较大提高。

1 嵌入式Linux移植流程

嵌入式Linux系统从软件的角度看通常可以分为4个层次:

1)引导加载程序 包括固化在固件中的启动代码(可选)和Bootloader 2部分。

2)内核 特定于嵌入式板子的定制内核以及控制内核引导系统的参数。

3)文件系统 包括根文件系统和建立于Flash内存设备之上的文件系统。通常用RAMDISK作为根文件系统。它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体[2]。

4)用户应用程序 特定于用户的应用程序。有时在用户应用程序和内核层之间可能会包括一个嵌入式图形用户界面[3]。

嵌入式Linux的移植可以按照上面4个层次进行。本文将根据这4个方面分析嵌入式Linux系统在s3c2440上的移植过程。

2 交叉编译环境的建立

2.1 交叉编译工具的安装

Linux使用GNU的工具,社区的开发者已经编译出了常用体系结构的工具链。免费提供的工具包括3个部分:binutils,gcc和glibc,其中binutils是二进制处理工具,gcc是编译工具,glibc是链接和运行库。交叉编译工具的安装步骤如下:

1)从 ARM Linux 的官方站点 http://arm.Linux.org.uk 下载 cross23.3.2.tar.bz2 包;

2)在/usr/local/arm 下解压:$tar2jxvfcross23.3.2.tar.bz2;

3)在/etc/profile文件中修改PATH环境变量。在export之前添加一行:

PATH=$PATH: /usr/local/arm/3.3.2/bin 4)使以上配置生效:$source/etc/profile

2.2 主机开发环境的配置

1)主机环境配置:首先要确认主机的网络接口驱动成功,并且配置网络接口的IP地址。可以通过ifconfig命令查看所有网络接口,还可以配置网口的IP地址。

2)串口控制台工具:串口通信接口很适合作为控制台,在各种操作系统上一般都有现成的控制台操作程序可以使用。Windows操作系统有超级终端 (Hyper terminal)工具;Linux操作系统有minicom工具。

3)TFTP服务:TFTP是目标板下载映像所需要的网络服务。以root身份登录,完成下面的操作:

·编辑tftp配置文件:

$vi/etc/xinetd.d/tftp

修改disab l一行,把yes改为no;

·使用下面的命令使x inetd重新启动TFTP服务:

$/etc/init.d/xinetd restart

4)N FS服务:N FS服务的主要任务是把本地的一个目录通过网络输出,其他计算机可以远程的挂接这个目录并且访问文件。以root的身份完成以下步骤:

·在/etc/export s中添加一行:

/opt/target/root fs3(rw,no_root_squash,no_all_squash)

·确认N FS守护进程已在运行。使用下面命令启动或重启N FS服务:

$/etc/rc.d/init.d/nfs restart

3 嵌入式Linux在ARM上的移植分析

3.1 U-Boot的移植

U-Boot作为通用的Bootloader,U-Boot可以方便地移植到其他的硬件平台上。移植U-Boot工作就是添加开发板硬件相关的文件、配置选项,然后配置编译。开始移植之前,需要先分析一下U-Boot已经支持的开发板,比较出硬件配置最接近的开发板[4]。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等外围设备。因为U-Boot代码中的SMDK2410模板所采用的CUP是s3c2410与s3c2440相似,所以对于U-Boot移植,就是修改SMDK2410模板代码。

这里使用的是u-boot-1.1.6,其移植的基本步骤如下:

1)在顶层Makefile中为开发板添加新的配置选项。

RSC2440_config: unconfig

@./mkconfig$(@:_config=) arm arm920t RSC2440 NULL s3c24x0

2)修改 flash驱动

修改 board/smdk2410/flash.c, 该文件为 RSCARM2440的Flash驱动程序。需要根据Flash芯片手册实现它的驱动程序。

3)修改与RSCARM2440相关的头文件

修 改 include/configs/smdk2410.h, 该 文 件 是 与 RSC ARM2440相关的头文件。启动方式有从nandflash启动和从norflash启动两种,可根据自己的需要修改。

4)修改目标板的初始化文件

修改board/smdk2410/smdk2410.c,该文件为目标板的初始化文件,其中主要修改的函数有:

intboard_init( ); //板极初始化函数

int dram_init(); //SDRAM初始化函数

5)修改串口驱动

修改 cpu/arm920t/serial.c,该文件为 RSC ARM2440 的串口驱动程序,使用RSCARM2440的UART0。

6)修改网络驱动

RSC ARM2440 使用的是 DM9000 网卡,u-boot-1.1.6 中支持DM9000,其代码在drivers/dm9000x.c中,因此可以直接使用。另外,还需要把DM9000驱动在include/configs/rsc2440.h加以说明。

3.2 配置编译内核

标准Linux内核相对于资源受到限制的嵌入式系统来说过于庞大,因此要将其移植到嵌入式系统上,就需要将Linux内核根据目标平台的情况进行剪裁、配置,并对配置好的内核进行编译生成内核映像文件。Linux2.6内核吸收了一些新技术,在性能、可量测性支持和可用性方面有有较大的提高[5]。

1)修改 Makefile

将makefile中直接将ARCH=$(SUBARCH)这行注释掉,并加入一行ARCH=arm,目的就是要使编译出来的目标文件面向的是arm平台。

还要注释掉CROSSCOMPILE=这行,加一行CROSS COMPILE=arm-linux-。修改这一行是为了在编译过程中使用交叉编译器。

2)配置内核

使用makemenuconfig来配置内核,尽量裁减内核,可以舍弃的部分都先去掉。

3)编译内核

#make dep

#make clean

#make zImage(注意大小写)

内核编译成功以后,会在Linux2.6/arch/arm/boot目录中生成一个新内核的映像文件zImage。

3.3 制作Ram disk

Ramdisk不是一个文件系统。在Linux中,可以把系统内存中的一部分仿真成一个硬盘块,在它上面可以实现各种基于内存的文件系统,如Ext2 onRamdisk。内存的存储速度要远远快于硬盘,所以可以用这个方法提高文件访问速度。

3.3.1 制作Linux根文件系统

Linux在内核启动以后,要装载根文件。在嵌入式Linux中,受存储器的限制,不能使用桌面Linux那样复杂的root文件系统,需要对于文件系统进行重新设计和裁减[6]。通常的处理方法如下:

1)删除处理 对一些在嵌入式系统中无关的目录和文件进行直接删除处理。

2)strip处理 在Linux中,库文件和二进制可执行文件在发行时,都包括大量的调试信息,在嵌入式应用中,可以去掉这些代码以减小程序的大小,采用这种方法有时可以使程序缩小30-50%,从而有效节约空间。如在嵌入文件系统制作中,可以采用下面命令:

objcopy——strip-all FROM TO

objcopy命令在复制文件时,带strip-all.参数,将文件中的调试信息去掉。

3)文件替换处理 标准 Linux中有些文件功能强丸但体积过大,在嵌入式应用中,可以采用一些功能简单和小巧的文件去替换原来的文件。如在标准的Linux发行套件中有数以千计的二进制命令文件,显然这对嵌入式系统是不合适的,却而代之,通常使用busybox来提供这些命令。

3.3.2 制作Ramdisk

Ramdisk就是把指定的内存区域模拟成磁盘设备,它属于块设备驱动程序,基于Ramdisk的块设备,可以建立EXT2格式的磁盘文件系统。在内核启动之前,通常需要把EXT2文件系统的压缩镜像解压到内存指定的位置,然后就可以把Ramdisk设备挂载成根文件系统。制作Ramdisk映像的步骤如下:

这样就生成了一个压缩的根文件系统initrd.bin。

4 移植Linux系统到ARM开发板上

1)烧写 U-Boot

烧写U-Boot是在windows中通过JTAG进行的,烧写工具是 SJF2440.exe。把 u-boot.bin 和 SJF2440.exe 拷贝到同一文件夹中。在保证开发板从nandflash方式启动的情况下,运行“SJF2440/f:u-boot.bin”,此命令调入 u-boot.bin 文件烧写 falsh。

2) 通过 u-boot把 zIamge和 initrd.bin烧写到 flash对应的分区中。

烧写zIamge:

#erase 100000 1fffff

#tftp 30000000 zImage

#cp.b 30000000 100000 b9072

烧写 initrd.bin:

#erase 200000 6fffff

#tftp 30000000 initrd.bin

#cp.b 30000000 200000 312bf0

3)设置u-boot环境变量让系统自动启动

#setenv bootargs root=/dev/arm rw initrd=0x30800000,8M

#setenv bootcmd bootm 100000 200000

#setenv bootdelay 3

#saveenv

系统复位后,Linux系统就可以完全自动地从本地flash启动了。

5 结束语

本文针对一个特定的目标平台,提供了构建一个基本嵌入式Linux系统的过程与方法。对Linux内核版本进行裁减、

移植,编译生成的内核在S3C2440处理器的目标板上成功运行,且保留了Linux原有的工作稳定的特点,制作的根文件系统可以通过Ramdisk方式正常加载进内核。将Linux操作系统移植于嵌入式系统中作为嵌入式系统的底层研发平台是一件非常引人注目的事,同时又是一个复杂的课题,移植后系统的实时性、稳定性、安全性和精简程度等方面都需要嵌入式技术开发人员在设计中进一步研究。

[1]孙纪坤,张小全.嵌入式Linux系统开发技术祥解[M].北京:人民邮电出版社,2006.

[2]孙天泽,袁文菊.嵌入式设计及Linux驱动程序开发指南[M].北京:电子工业出版社,2007.

[3]陈赜.ARM9嵌入式技术及linux高级实践教程[M].北京:北京航空航天大学出版社,2005.

[4]王学龙.嵌入式系统设计与应用[M].北京:清华大学出版社,2002.

[5]北京革新科技有限公司.ARM9实验指导书[M].北京:北京革新科技有限公司,2007.

[6]赵炯.Linux内核完全注释[M].北京:机械工业出版社,2004.

猜你喜欢

开发板驱动程序内核
万物皆可IP的时代,我们当夯实的IP内核是什么?
强化『高新』内核 打造农业『硅谷』
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
Microchip最新推出两款PIC32 Curiosity开发板
浅析单片机开发板的设计与制作
Mouser为您呈上开发关键之STMicroelectronics Nucleo开发板
Arduino和Atmel发布Arduino Zero开发板
驱动程序更新与推荐
驱动程序更新与推荐