kaiyun官方注册
您所在的位置: 首页> 嵌入式技术> 设计应用> Linux内核在S3C2410上移植的研究
Linux内核在S3C2410上移植的研究
山西电子技术
荀艳丽
摘要:以研究将Linux内核移植到嵌入式系统的技术为目的,描述了Linux-2.4.18.-rm7-pxal移植到S3C2410处理器目标板上的方法。详细介绍了Linux内核移植方法与步骤,并说明了如何搭建移植环境。结果表明,该方法简单实用,达到了预定目标。
Abstract:
Key words :

嵌入式系统就是以应用为中心,以计算机技术为基础的软、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。Linux操作系统是一种性能优良、源码公开且被广泛应用的免费操作系统,由于其体积小,可裁减,运行速度高等优点,因此可以作为研究嵌入式操作系统和非实时操作系统的典范。EL-ARM-830+型教学实验系统是一种综合的教学实验系统,该系统采用了ARM92 0T核,32位微处理器,实现了多模块的应用实验。在实验板上有丰富的外围扩展资源,可以完成ARM的基础实验、算法实验和数据通信实验、以太网实验。

1 Linux的实验环境搭建
1.1 Redhat9.0操作系统的安装
安装Redhat9.0前,先把串口配置好,这是建立Linux系统和试验箱之间的串口通信。配置完以后在启动Linux系统时点击全屏,这样做的目的是让Linux系统占取网络资源。点击VM→setting在弹出的窗口点击左下角的Add按钮,此时选择serial Port,依次点击“下一步”,直到配置完串口。
1.2 配置NFS网络文件系统
首先在Linux主机的终端上执行setup,弹出菜单界面后,选中Firewall configuration,回车,进入系统服务选项菜单,选择no firew all关闭防火墙(如果安装了防火墙),按空格键就会选中,然后退出。但是,setup里面会照样显示防火墙设置是high的,这个可以不必理会。之后选中System services,回车,进入系统服务选项菜单,在其中选中[*]nfs,然后按F12键退出,再选择方向键,退出setup界面,返回到命令提示符下。利用编辑器打开/etc/exports文件(输入命令vi/etc/exports),按A进入文本输入模式,将这个默认的空文件修改为只有如下一行内容:
/(rw)
/home/nfs
然后,保存退出(按ESC键进入命令模式,输入:进入到最后行模式,输入wq!保存退出),之后改变目录到/etc/rc.d/init.d/下(输入命令cd/etc/rc.d/init.d/),执行如下命令:
./nfs start
终端内输出:
Starting NFS services:[确定]
Starting NFS quotas:[确定]
Starting NFS daemon:[确定]
Starting NFS mountd:[确定]
(1)安装交叉编译器。打开Linux系统下的终端,在里面输入命令cd/linuette/RPMS/改变目录到/linuette/RPMS下,输入如下命令:
#rpm-UVh*.rpm
等待系统安装,如果所有的RPMS内的文件全部正确安装,将会在根目录下的/opt文件夹内生成一个host文件夹,交叉编译库就在该目录下,到此交叉编译环境就搭建好了。
(2)用交叉网线连接主机和实验系统。在Linux的开始菜单里启动终端,在终端[root@localhost root]#minicom-s回车,按S键选择Seri al Port setup回车,弹出串行口设置界面,按A键编辑Serial Device:/dev/ttys0回车;按E键,再按I键,回车,选择为Bps/Par/Bit s:115200 8N1回车;按F键,选择Hardware Flow Control:No。设置完后回车,然后用上下选择键,选中Modem and dialing,将Initstri ng,Reset string,Hang-up string设置为空,再选中Save setup as df1这一项,回车,保存为默认的配置,下次进入minicom时就不用再设置了。用上下选择键选中Exit回车退出设置,进入minicom。
(3)Linux系统下网络设置。点击左下角的小红帽,选择系统设置一网络,然后双击设备eth0的蓝色区域,进入以太网设置界面,在静态设置IP地址栏下面输入与宿主机一个网段的IP地址、网关及子网掩码,确定后激活网络设备。
(4)Ping通主机和实验系统。在minicom下,给系统上电,系统正常起来后,利用ifconfig eth0 xxx.xxx.xxx.xxx来改变实验系统的IP地址,让该地址的前三段和主机的前三段一致,最后的一段,可以选择与主机不重复的小于255的任意值。利用mount命令,挂载主机的nfs系统下的共享目录。
利用命令chmod 777/home/nfs改变/home/nfs文件夹的属性,让其变为可读可写,输入mount-onolock 192.168.0.1:/home/n fs/mnt/yaffs回车,即可完成把主机上的/home/nfs下的文件挂载到实验系统的/mnt/yaffs目录下。

2 BootLoder引导程序的移植
在嵌入式系统中,BootLoader的作用与PC机上的BIOS类似,通过.BootlLoader可以完成对系统板上的主要部件如CPU,SDRAM,FLASH、串行口等进行初始化,也可以下载文件到系统板上,对FLASH进行擦除与编程。当运行操作系统时,它会在操作系统内核运行之前运行,通过它,可以分配内存空间的映射,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统准备好正确的环境。因此,正确建立Linux移植的前提条件是具备一个与Linux配套、易于使用的Boot Loader,它能够正确完成硬件系统的初始化和Linux的引导。
系统使用的BootLoader是VIVI。VIVI是CPU加电后运行的第一段程序,其基本功能是初始化硬件设备,建立内存空问的映射图,从而为调用嵌入式Linux内核做好准备。为能够实现正确引导Linux系统的运行,以及当编译完内核后,快速下载内核和文件系统,VIVI首先通过串口下载内核和文件系统,当系统正常运行起来后,网络驱动正常运行后,VIVI就通过网口下载内核和文件系统。同时,它也具有功能较为完善的命令集,对系统的软硬件资源进行合理的配置与管理。

当上电或复位后,VIVI启动,位于NANDFLASH中的前4 KB程序便从NANDFLASH中由S3C2410自动拷贝到一个叫SteppingStone的4 KB的内部RAM中,该RAM之后被映射到地址0x00处。此时,也就是VIVI前4 KB代码开始运行,进行第一阶段的硬件初始化,主要工作为:关Watchdog Timer,关中断,初始化PLL和时钟主频设定,初始化存储器控制器。VIVI初始化的主要内容:
VIVI初始化阶段一(在/arch/s3C2410/head.s文件内):
硬件初始化
配置串口
复制自身到SDRAM中(跳转到C代码入口函数)
VIVI初始化阶段二(在/init/main.c文件内):
对硬件系统继续初始化
内存映射初始化、内存管理单元MMU初始化
初始化堆
初始化mtd设备
初始化私有数据
初始化内置命令
启动VIVI

3 Linux内核的移植
3.1 内核移植
实验系统运行的Linux版本是针对2.4.18进行移植的Linux-2.4.18.-rm7-pxal版本。本实验是把该移植好的内核,让它如何在自己的硬件系统上正常的运转起来。
Linux内核主要由5个子系统组成:进程调度子系统、进程间通信子系统、内存管理子系统、虚拟文件系统子系统、网络接口子系统。
(1)设置目标平台和指定交叉编译器:在最上层的根目录/Makefile文件中,首先要指定所移植的硬件平台,以及所使用的交叉编译器。改为如下:
ARCH:=arm
CROSS_COMPILE=/opt/host/armv41/bin/armv41-unknown-Linux-
也就是说,所移植的硬件平台是ARM,所使用的交叉编译器是存放在目录/opt/host/armv41/bin/下的armv41-unknown-Linux-xxx等工具。
(2)arch/arm目录下Makefile修改。系统的启动代码是通过这个文件产生的。在Linux-2.4.18内核中要添加如下代码:
ifeq(MYM(CONFIG_ARCH_S3C2410),y)
TEXTADDR =0 xC0008000
MACHINE =s3c2410
endif
这里TEXTADDR确定内核开始运行的虚拟地址。
(3)arch/arm目录下config.in修改。配置文件config.in能够配置运行“make menuconfig”命令时的菜单选项,由于2.4.18内核中没有S3C2410的相关信息,所以要在该文件中进行有效的配置。
(4)arch/arm/boot目录下Makefile修改。编译出来的内核存放在该目录下,这里指定内核解压到实际硬件系统上的物理地址。要根据实际的硬件系统修改解压后,内核开始运行实际的物理地址。
(5)arch/arm/boot/compressed目录下Makefile修改。该文件从vmLinux中创建一个压缩的vmlinuz镜像文件。该文件中用到的SYSTE M,ZTEXTADDR,ZBSSADDR和ZRELADDR是从arch/arm/boot/Makefile文件中得到的。添加如下代码:
ifeq(MYM(CONFIG_ARCH_S3C2410),y)
OBJS+=head-s3c2410.o
Endif
(6)arch/arm/boot/compressed目录下添加head-s3c2410.s。该文件主要用来初始化处理器。
(7)arch/arm/def-configs目录下添加配置好的S3C2410的配置文件。
(8)arch/arm/kernel目录下Makefile修改。该文件主要用来确定文件类型的依赖关系。
(9)arch/arm/kernel目录下的文件debug-armv.s修改。在该文件中添加如下代码,目的是关闭外围设备的时钟,以保证系统正常运行。
(10)arch/arm/kernel目录下的文件entry-armv.s修改,CPU初始化时处理中断的汇编代码。
(11)arch/arm/ram目录下的相关文件。那里面则是移植好的有关arm的内存管理代码。
(12)arch/arm/mach-s3c2410目录下的相关文件。
那里面则是针对s3c2410这款处理器编写的所需代码。
3.2 制作cramfs文件系统
利用工具软件MKCRAMFS制作cramfs文件系统,MKCRAMFS工具在/实验软件/tools/目录下,该文件系统是一个只读压缩的文件系统,文件系统类型可以是ext2,ext3等。这里提供的一个系统目录是root_tech,它里面包含将来要用到的所有文件,它在/实验软件/source_ code/的目录内,为root.tar.bz2。把制作工具和root_tech放在同一个文件夹下并对root.tar.bz2进行解压,在终端下切换到那个文件夹目录下使用命令MKCRAMFS root_tech rootfs.cramfs,就可把root_tech制作成文件名为rootfs.cramfs的只读的压缩的cramfs文件系统了。系统启动后,内核将把它加载到内存中,解压。

4 结语
本文针对一个特定的目标平台,提供了构建一个基本嵌入式Linux系统的过程与方法。对Linux 2.4内核版本进行裁减、移植,编译生成的内核在S3C2410处理器的目标板上成功运行,且保留了Linux原有的工作稳定的特点。将Linux操作系统移植于嵌入式系统中作为嵌入式系统的底层研发平台是一个复杂的问题,移植后系统的实时性、稳定性、安全性和精简程度等方面问题还需要在以后的设计中进一步研究。

此内容为AET网站原创,未经授权禁止转载。
Baidu
map