一.序言
面向ARM微处理器架构的嵌入式操作系统的使用量将在今后三年持续下降,在各类嵌入式操作系统中,Linux是获得支持最多的第三大力量。
目前,ARMLinux支持包括ARM610、ARM710、ARM720Tcores、ARM920920Tcores、StrongARM110、StrongARM1100、XScale等系列的ARM处理器。这种处理器都具有MMU单元,与之相对应是NOMMU的uClinux,主要是支持ARM7TDMI系列的微处理器。在ARMLinux的基础上,好多开发者将其移植到了自己的硬件平台上,并递交相应的MachineType。
本文以实例剖析完整地介绍了移植的过程,对于打算在ARMLinux上做应用开发的技术人员有一定的借鉴作用。
二.ARMLinux的移植过程
将ARMLinux移植到特定的硬件平台上,大致须要分成四个步骤:
2)之后是配置和编译内核,必要时还要对源码做一定的更改;
3)第三步就是须要制做RAMdisk来挂接根文件系统;
4)最后是下载、调试内核并在RAMdisk中添加自己的应用程序。
本文以StrongARM为例,说明怎样将ARMLinux移植到SA1110微处理器上。
下边分四个部份介绍移植工作:
1.内核源码及交叉编译环境的打算
2.ARMLinux的内核配置与编译
3.制做RAMDisk
4.内核下载和运行
1.内核源码交叉编译环境和打算
1.1内核源码下载
标准Linux的内核源码可以从ftp://下载,在好多的镜像ftp站点上也可以便捷地获得,建议使用2.4版本的内核。ARMLinux是基于标准Linux、内核为ARM做的补丁,在ftp://.uk上可以下载。其实也可以直接下载早已针对标准内核打好补丁的ARMLinux源码包,诸如SkyEye上提供的linux-2.4.18-rmk7.tar.bz2,就是基于2.4.18内核和rmk7补丁,可以直接解压以后进行编译。
1.2交叉编译环境的构建
移植前须要在宿主机上构建ARM的交叉编译环境,主要用到的开发工具包括三个部份:binutils、gcc、glibc。其中,binutils是二补码文件的处理工具;gcc是编译工具;glibc是链接和运行库。所有须要用到的工具既可以下载源码自行编译,也可以直接下载早已编译好的二补码工具。
1.2.1.binutils的安装
binutils主要包含了一些辅助开发工具,比如objdump显示反汇编码、nm列举符号表、readelf显示elf文件信息及段信息、strip将毋须要的代码除去以降低可执行文件大小等。这种工具在嵌入式开发早期,尤其是移植调试操作系统时特别有用。
安装的步骤:
1)下载安装包文件:binutils-2.11.2.tar.gz;
2)解开安装包到当前目录下:
tarzxfbinutils-2.11.2.tar.gz,此时在当前目录下生成一个binutils-2.11.2目录。
3)配置安装包:./configure--target=arm-linux--prefix=/usr/local
target选项表示选取的目标代码格式,通常是arm-linux,prefix表示在执行makeinstall时的安装根路径。
4)编译和安装:make、makeinstall
注意安装时可能须要root权限,在prefix目录下当前用户有写权限,安装成功后,binutils工具将安装在/usr/local/arm-linux目录下。
1.2.2.gcc交叉编译器
gcc是拿来编译内核代码的工具,使用它可以编译汇编语言和C语言的程序,生成ARM的代码。建议使用gcc2.95以上的版本来创建ARM开发环境,本文使用2.95.3版本。
安装的步骤:
1)下载安装包文件和补丁程序:gcc-2.95.3.tar.gz;gcc-2.95.3.diff.bz2
2)解开安装包到当前目录下:
tarzxfgcc-2.95.3.tar.gz,此时在当前目录下生成一个gcc-2.95.3目录linux移植需要注意到地址吗,步入该目录。
3)对当前的安装包打补丁:
bzcat../gcc-2.95.3.diff.bz2|patch-p1。
4)更改gcc/config/arm/t-linux文件,在文件最后加上如下条件编译选项:
T_CFLAGS=-Dinhibit_libc-D__gthr_posix_h。
5)配置安装包:./configure--target=arm-linux--prefix=/usr/local--with-headers=armlinux源码目录下的include目录。
这儿前两个选项和前面binutils的安装类似,--withheaders是拿来指定内核头文件的目录,通常就可以使用前面ARMlinux的include目录。须要注意的是这儿的路径须要用全路径名,而不能使用相对路径。
6)编译源码:makeLANGUAGE=“C”
这儿由于还没有一个ARM可用的glibc,所以只能编译C语言的交叉编译工具。假如在编译好glibc以后linux操作系统教程,就可以回去重新编译gcc,以支持其他语言。
7)安装编译好的工具:makeinstallLANGUAGE=“C”
安装成功之后,arm-elf-gcc将安装在/usr/local/arm-linux目录下。有了安装好的binutils和gcc工具,就可以拿来编译ARMLinux内核了。假如须要在ARMLinux做应用程序的开发,就还须要一个glibc库的支持。
1.2.3.glibc库
glibc的编译须要为刚刚做好的ARM交叉编译器指定编译器;否则编译出的glibc代码将会是同时有ARM和x86代码的混合体。
2.ARMLinux的内核配置与编译
1)解开安装包:tarzxfglibc-2.2.3.tar.gz。
此时在当前目录下生成一个glibc-2.2.3目录,步入该目录。
2)解开glibc-linuxthreads安装包:tarzxvf../glibc-linuxthreads-2.2.3.tar.gz
3)设置编译器:CC=arm-linuxgcc
4)配置安装包:./configurearm-linux--build=i586-linux--prefix=/usr/local/arm-linux-enable-add-ons
arm-linux表示选ELF格式的可执行格式,--build=i586-linux表示拿来制做交叉开发环境的宿主机的机器类型,--prefix=/usr/local/armlinux表示安装的路径,这儿不能指定为/usr/local,否则会把/usr/local下的库覆盖掉linux移植需要注意到地址吗,须要特别留心。
5)编译和安装:make;makeinstall
安装成功后,glibc库将安装在/usr/local/arm-linux目录下。
3.制做RAMdisk(RamDisk也就是显存盘的意思)
所谓的RAMdisk,实际上是把系统显存划出一部份当成硬碟使用。对于操作系统来讲显存的存取速率远远小于机械c盘,所以RAM驱动器肯定要比机械的硬碟快得多。你可以把整个应用程序都安装在RamDisk的驱动器中,之后用显存的速率运行它.
ARMLinux采用RAMdisk的形式来装载根文件系统,所有在运行内核之前,须要先制做RAMdisklinux服务器系统,将必须的文件和设备加入到RAMdisk中,当内核启动后,会从指定地址去读取根文件系统,这儿我们使用RAMdisk,在显存中虚拟一个c盘,具体方式如下:
1)首先创建一个512k的虚拟c盘,文件名为initrd.img:
ddif=/dev/zeroof=initrd.imgbs=1kcount=512
2)将虚拟c盘文件格式化成ext2文件系统格式:
mkfs.ext2-cinitrd.img
这就生成了一个支持ext2文件系统的ramdisk
3)添加文件和设备
mount这个文件系统到/tmp下,mount-oloop-text2initrd.img/tmp
4)向/tmp中添加linux启动必须的文件和设备
/bin/sh
/bin/init
/dev/console
/etc/rc
/etc/motd
以上这几个程序和设备是启动Linux必须的,这样得到的ramdisk大概是400k。
代码:针对这几个目录的解释(谢谢david的收集整理)
.
/bin/sh(/bin/sh是一个SHELL,拿来启动系统时执行好多脚本程序的)
/bin/initinit进程的启动程序,在核内引导完成后,LINUXKERNEL就会执行/sbin/init,/etc/initor/bin/init
/dev/console是系统控制终端,可以理解为console指向激活的那种tty(确切地说是激活的那种tty才将输出显示到console)
/etc/rc当改变服务的运行级别时,此文件负责启动/停止服务
/etc/motd在管理员希望向Linux服务器的所有用户传达某个消息时使用,例如登入时会复印下来这儿面的内容
4.内核的下载和执行
4.1.内核下载
内核的下载通常通过bootloader来完成的,其实也可以通过更改arch/arm/Makefile文件来设置自己的TEXTADDR;TEXTADDR的值在make时传递给arch/arm/vmlinux.lds,在链接时,arm-linux-ld将使用vmlinux.lds来定位内核的起始地址。
假如是压缩的内核,则可以在makemenuconfig时,选择Generalsetup->
CompressedbootloaderinROM/flash
(0)CompressedROMbootloaderbaseaddress
(c0000000)CompressedROMbootloaderBSSaddress
这儿缺省的CompressedROMbootloaderbaseaddress是0。
4.2.RAMdisk下载
RAMdisk的下载也是通过bootloader来完成的,它的下载底子好是在内核源码文件arch/arm/machsa1100/assaber.c中定义的,在fixup_addabet()函数中设置了:
t->u.initrd.start=0xc0800000;
t->u.initrd.size=3*1024*1024;
我们制做的ramdisk只有512k,所以须要更改t->u.initrd.size=512*1024;下载地址为0xc0800000
4.3内核运行
按照硬件情况更改源码编译然后,就可以通过bootloader下载执行了,内核运行时会通过并口向主机上的超级终端输出启动信息;当ARMlinux启动并步入shell以后,就可以运行用户编撰的应用程序了,添加自己的应用通常分为两个步骤:
1)交叉编译得到应用程序的可执行文件(elf格式)
2)将该可执行文件添加到ramdisk中
【全文完】