如何向一块ARM裸板linux移植到armlinux系统

嵌入式Linux毕业班(自己写BootLoader和移植篇)
一二期成效班,学成可以找到不错工作!
嵌入式Linux毕业班(自己写BootLoader和移植篇)
嵌入式Linux毕业班(自己写BootLoader和移植篇)
thisway_diy
2003年毕业于中国科学技术大学,电子专业、软件专业双学位。近10年嵌入式开发经验,曾在知名公司领导团队全程开发车载手机,
在中兴通信负责网络电视、机顶盒、IPCamera多个项目的Linux底层系统开发。
近年来一直从事产品定制服务:根据客户需求进行全套产品设计(硬件、底层软件);
帮各公司解决Linux方面的技术难题。近5年作为特聘讲师在若干个有名的培训机构讲课。 擅长ARM系列方面的硬件原理图设计,
精通ARM、MIPS、Blackfin等架构处理器的Linux底层系统开发。
著有《嵌入式LINUX应用开发完全手册》一书,自2008年来一直是Linux系统类畅销书。
每天在QQ群进行技术答疑,5年来一直如此。
课程价格:
嵌入式Linux毕业班(自己写BootLoader和移植篇)
讲师:thisway_diy
课程价格:
课程简介:免费嵌入式Linux视频,毕业班必看课程!教你如何写出正常启动内核的bootloader;移植UBOOT及linux内核,并移植二期驱动到内核;熟练掌握汇编代码,正确分析裸板中u-boot、内核里的相关汇编代码;深入理解ARM体系统架构,教你如何写出中断功能的裸板程序,对程序现场的保存、恢复进行了解,其中原理适用于任何架构CPU,适用于内核及应用程序。
1: 自己写Bootloader
2: U-boot移植
3: Linux移植
4: 移植驱动到新内核
2003年毕业于中国科学技术大学,电子专业、软件专业双学位。近10年嵌入式开发经验,曾在知名公司领导团队全程开发车载手机,
在中兴通信负责网络电视、机顶盒、IPCamera多个项目的Linux底层系统开发。
近年来一直从事产品定制服务:根据客户需求进行全套产品设计(硬件、底层软件);
帮各公司解决Linux方面的技术难题。近5年作为特聘讲师在若干个有名的培训机构讲课。 擅长ARM系列方面的硬件原理图设计,
精通ARM、MIPS、Blackfin等架构处理器的Linux底层系统开发。
著有《嵌入式LINUX应用开发完全手册》一书,自2008年来一直是Linux系统类畅销书。
每天在QQ群进行技术答疑,5年来一直如此。
硬禾即将开班课程
温馨提示:
电子活动E起来
该课程有 521
加入课程后可以跟讲师学生进行问答互动。
(尚未评分)
{{review.content}}2009年2月 Linux/Unix社区大版内专家分月排行榜第三2008年10月 Linux/Unix社区大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。21ic官方微信-->
后使用快捷导航没有帐号?
查看: 1192|回复: 3
转:Linux操作系统在ARM上 的移植过程及分析
&&已结帖(0)
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
& && &面向A R M 微处理器构架的嵌入式操作系统的使用量将在今后五年持续增长,在各种嵌入式操作系统中,Linux是获得支持最多的第三大力量。
& && &目前,ARM Linux 支持包括A R M 6 1 0 、A R M 7 1 0、A R M 7 2 0 Tcores、ARM920T cores、StrongARM110、StrongARM 1100、XScale 等系列的 ARM 处理器。这些处理器都具有M M U 单元,与之相对应是NO MMU 的uClinux,主要是支持ARM7TDMI 系列的微处理器。在ARM Linux 的基础上,很多开发者将其移植到了自己的硬件平台上,并提交相应的 Machine Type。
本文以实例分析完整地介绍了移植的过程,对于准备在 ARM Linux 上做应用开发的技术人员有一定的借鉴作用。
二. ARM Linux 的移植过程
& && &&&将ARM Linux 移植到特定的硬件平台上,大致需要分成四个步骤:
& && && && && && &&&1)首先是准备工作,包括下载源码、建立交叉编译环境等;
& && && && && && &&&2)然后是配置和编译内核,必要时还要对源码做一定的修改;
& && && && && && &&&3)第三步就是需要制作 RAM disk 来挂接根文件系统;
& && && && && && &&&4)最后是下载、调试内核并在 RAM disk中添加自己的应用程序。
本文以StrongARM 为例,说明如何将 ARM Linux 移植到 SA1110 微处理器上。
下面分四个部分介绍移植工作:
1.内核源码及交叉编译环境的准备
2.ARM Linux 的内核配置与编译
3.制作RAM Disk
4.内核下载和运行
1.内核源码交叉编译环境和准备
1.1 内核源码下载
& &&&标准Linux 的内核源码可以从 下载,在很多的镜像ftp 站点上也可以方便地获得,建议使用 2.4 版本的内核。ARM Linux 是基于标准Linux、内核为ARM 做的补丁,在上可以下载。当然也可以直接下载已经针对标准内核打好补丁的ARM Linux源码包,例如 SkyEye 上提供的 linux-2.4.18-rmk7.tar.bz2,就是基于 2.4.18内核和 rmk7 补丁,可以直接解压之后进行编译。
, , , , , , , , ,
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
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) 解开安装包到当前目录下:
& && &tar&&zxf&&binutils-2.11.2.tar.gz,此时在当前目录下生成一个 binutils-2.11.2目录。
3) 配置安装包:./configure --target=arm-linux --prefix=/usr/local
& &&&target 选项表示选定的目标代码格式,一般是 arm-linux,prefix 表示在执行 make install 时的安装根路径。
4) 编译和安装:make、make install
& & 注意安装时可能需要 root 权限,在prefix目录下当前用户有写权限,安装成功后,binutils工具将安装在/usr/local/arm-linux 目录下。
1.2.2. gcc 交叉编译器
& &&&gcc 是用来编译内核代码的工具,使用它可以编译汇编语言和C语言的程序,生成ARM的代码。建议使用gcc 2.95以上的版本来创建ARM开发环境,本文使用2.95.3版本。
安装的步骤:
1) 下载安装包文件和补丁程序:gcc-2.95.3.tar.gz;gcc-2.95.3.diff.bz2
2) 解开安装包到当前目录下:
& & tar zxf gcc-2.95.3.tar.gz,此时在当前目录下生成一个 gcc-2.95.3 目录,进入该目录。
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=arm linux源码目录下的include目录。
& & 这里前两个选项和上面binutils的安装类似,--withheaders是用来指定内核头文件的目录,一般就可以使用上面ARM linux的include目录。需要注意的是这里的路径需要用全路径名,而不能使用相对路径。
6 ) 编译源码:make LANGUAGE=“C ”
& & 这里因为还没有一个ARM可用的glibc,所以只能编译C 语言的交叉编译工具。如果在编译好 glibc 之后,就可以回来重新编译gcc,以支持其他语言。
7) 安装编译好的工具:make install LANGUAGE=“C”
& & 安装成功以后,arm-elf-gcc将安装在/usr/local/arm-linux目录下。有了安装好的binutils和gcc工具,就可以用来编译ARM Linux内核了。如果需要在ARM Linux 做应用程序的开发,就还需要一个glibc库的支持。
1.2.3. glibc 库
& && & glibc 的编译需要为刚才做好的ARM 交叉编译器指定编译器;否则编译出的glibc代码将会是同时有ARM和 x86代码的混和体。
1) 解开安装包:tar zxf glibc-2.2.3.tar.gz。
& & 此时在当前目录下生成一个 glibc-2.2.3 目录,进入该目录。
2) 解开glibc-linuxthreads安装包: tar&&zxvf&&../glibc-linuxthreads-2.2.3.tar.gz
3) 设置编译器: CC=arm-linuxgcc
4) 配置安装包: ./configure arm-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下的库覆盖掉,需要非常留意。
5) 编译和安装: make install
& &&&安装成功后,glibc 库将安装在/usr/local/arm-linux 目录下。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
3. 制作RAM disk(RamDisk也就是内存盘的意思)
& &&&所谓的RAM disk,实际上是把系统内存划出一部分当作硬盘使用。对于操作系统来讲内存的存取速度远远大于机械磁盘,所以RAM驱动器肯定要比机械的硬盘快得多。你可以把整个应用程序都安装在RamDisk的驱动器中,然后用内存的速度运行它.
& & ARM Linux采用RAM disk的方式来装载根文件系统,所有在运行内核之前,需要先制作RAM disk,将必须的文件和设备加入到RAM disk中,当内核启动后,会从指定地址去读取根文件系统,这里我们使用RAM disk,在内存中虚拟一个磁盘,具体方法如下:
1)首先创建一个512k的虚拟磁盘,文件名为initrd.img:
& & dd if=/dev/zero of=initrd.img bs=1k count=512
2)将虚拟磁盘文件格式化成ext2文件系统格式:
& &&&mkfs.ext2 -c initrd.img
& &这就生成了一个支持ext2文件系统的ramdisk
3)添加文件和设备
& & mount这个文件系统到/tmp下,mount -o loop -t ext2 initrd.img /tmp
4)向/tmp中添加linux启动必须的文件和设备
& & /bin/sh
& & /bin/init
& & /dev/console
& & /etc/rc
& & /etc/motd
以上这几个程序和设备是启动Linux必须的,这样得到的ram disk大约是400k。
代码:针对这几个目录的解释(感谢david的搜集整理)
/bin/sh (/bin/sh是一个SHELL,用来启动系统时执行很多脚本程序的)
/bin/init init进程的启动程序,在核内引导完成后,LINUX KERNEL都会执行/sbin/init,/etc/init or /bin/init
/dev/console 是系统控制终端,可以理解为console指向激活的那个tty(准确地说是激活的那个tty才将输出显示到console)
/etc/rc 当改变服务的运行级别时,此文件负责启动/停止服务
/etc/motd&&在管理员希望向 Linux 服务器的所有用户传达某个消息时使用,比如登陆时会打印出来 这里面的内容
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 369, 距离下一级还需 131 积分
资深技术员, 积分 369, 距离下一级还需 131 积分
本帖最后由 CPU单线程 于
22:12 编辑
4.内核的下载和执行
4.1.内核下载
& &&&内核的下载一般通过bootloader来完成的,当然也可以通过修改arch/arm/Makefile文件来设置自己的TEXTADDR;TEXTADDR的值在make时传递给arch/arm/vmlinux.lds,在链接时,arm-linux-ld将使用vmlinux.lds来定位内核的起始地址。
如果是压缩的内核,则可以在make menuconfig时,选择General setup-&
& && && &Compressed boot loader in ROM/flash
& && &&&(0) Compressed ROM boot loader base address
& && &&&(c0000000) Compressed ROM boot loader BSS address
这里缺省的Compressed ROM boot loader base address是0。
4.2. RAM disk下载
& &&&RAM disk的下载也是通过bootloader来完成的,它的下载底子好是在内核源码文件arch/arm/machsa1100/assaber.c中定义的,在fixup_addabet()函数中设置了:
& &&&t-&u.initrd.start = 0xc0800000;
& && & t-&u.initrd.size = 3 * 1024 * 1024;
我们制作的ram disk只有512k,所以需要修改t-&u.initrd.size = 512 * 1024;下载地址为0xc0800000
4.3 内核运行
& &根据硬件情况修改源码编译之后,就可以通过bootloader下载执行了,内核运行时会通过串口向主机上的超级终端输出启动信息;当ARM linux启动并进入shell之后,就可以运行用户编写的应用程序了,添加自己的应用一般分为两个步骤:
& & 1)交叉编译得到应用程序的可执行文件(elf格式)
& & 2)将该可执行文件添加到ram disk中
& &【全文完】
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:

我要回帖

更多关于 arm系统移植 的文章

 

随机推荐