构建嵌入式linux详细步骤Word文档格式.docx
《构建嵌入式linux详细步骤Word文档格式.docx》由会员分享,可在线阅读,更多相关《构建嵌入式linux详细步骤Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
![构建嵌入式linux详细步骤Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/29/bf145035-5480-44a1-b813-b81a7d7a40b8/bf145035-5480-44a1-b813-b81a7d7a40b81.gif)
我们一般开发机上已经有一套开发工具,我们称之为原生开发套件,我们一般就是用它
们来写程序,那么,那什么又是交叉编译环境呢?
其实一点也不神秘,也就是在开发机上再
安装一套开发工具,这套开发工具编译出来的程序,如内核、系统工作或者我们自己的程序,
是放在目标主机上运行的。
那么或许有初学者会问,直接用原生开发工具为目标主机编译程序不就完了?
至少我当
初是这么想的。
一般来说,我们的开发机都是X86平台,原生开发套件开发的工具,也针
对X86平台,而我们的目标主机可能是PowerPC、IXP、MIPS……所以,我们的交叉编译
环境是针对某一类具体平台的。
一般来讲,交叉开发环境需要二进制工具程序、编译器、C链接库,嵌入式开发常用的
这三类软件是:
Binutils
Gcc
uClibc
当然,GNU包含的工具套件不仅于此,你还要以根据实际需要,进行选择
第二步、编译内核
开发工具是针对某一类硬件平台,内核同样也是。
这一步,我们需要用第一步中建立的
工具,对内核进行编译,对于有内核编译经验的人来说,这是非常简单的;
第三步、建立根文件系统
也就是建立我们平常看到的bin、dev、proc……这一大堆目录,以及一些必备的文件;
另外,我们还需要为我们的目标系统安装一些常用的工具软件,如ls、ifconfig……当然,
一个办法是找到这些工具的源代码,用第一步建立的交叉编译工具来编译,但是这些软件一
是数量多,二是某些体积较大,不适合嵌入式系统,这一步,我们一般都是用busybox来完
成的,包括系统引导软件init;
最后,我们为系统还需要建立初始化的引导文件,如inittab……
第四步、启动系统
在这一步,我们把建立好的目标、文件、程序、内核及模块全部拷贝到目标机存储器上,
如硬盘。
然后为系统安装bootloader,对于嵌入式系统,有许多引导程序可供我们使用。
不
过它们许多都有硬件平台的限制。
当然,如果你是工作在X86,可以直接用lilo来引导,事
实上,本文就是采用的lilo。
做到这一步,将目标存储设备挂上目标机,如果顺利,就可以启动系统了。
当然,针对某些特别的平台,不能像硬盘这样拷贝了,需要读卡器、烧录……但是基本
的方法是相通的!
第五步、优化和个性化系统
通过前四步,我们已经得到了一个可以正常工作的系统。
在这一步里,就是发挥你想像
的时候了……
本文的工作环境
项目根目录/home/kendo/project------>
我将它指定至PATH:
$PRJROOT
子目录及说明
目录内容
bootloader目标板的引导加载程序,如lilo等
build-tools建立交叉编译平台的工具源码
debug调试工具及所有相关包
doc项目中用到的所有文档
images编译好的内核映像,以及根文件系统
kernel各个版本的Linux内核源码
rootfs制作好的根文件系统
sysapps目标板将要用到的系统应用系统,比如thttpd,udhcpd等
tmp存放临时文件
tools编译好的跨平台开发工具链以及C链接库
工作的脚本
#!
/usr/bin
exportPROJECT=skynet
exportPRJROOT=/home/${PROJECT}
exportTARGET=i386-linux
exportPREFIX=${PRJROOT}/tools
exportTARGET_PREFIX=${PREFIX}/${TARGET}
exportPATH=${PREFIX}/bin:
/bin:
/sbin:
/usr/bin:
/usr/sbin
cd$PRJROOT
第二章建立交叉编译环境
在CU中发表的另一篇同名的贴子里,我讲述了一个全手工创建交叉编译环境的方法。
目前,创建交叉编译环境,包括建立根文件,一般来讲,有两种方法:
手功创建
可以得到最大程序的个性化定制,缺点是过程繁杂,特别是极易出错,注意这个“极”
字,包括有经验的开发人员;
自动创建
无它,方便而。
因为前一篇文章中,已经讲述了全手工创建交叉编译环境的一般性方法,本文就不打算
再重复这个步骤了,感兴趣的朋友,可以再去搜索那篇贴子,提醒一点的就是,在准备工具
链的时候,要注意各个工具版本之间的搭配、每个工具需要哪些补丁,我建议你在google
上针对这两项搜索一下,准备一个清单,否则……
本章要讲述的是自动创建交叉编译环境的方法。
目标,针对商业硬件平台,厂家都会为
你提供一个开发包,我用过XX厂家的IXP425和MIPS的,非常地方便,记得我第一次接
触嵌入式开发,拿着这个开发包自动化创建交叉编译环境、编译内核、建立根文件系统、创
建RamDisk,我反复做了三四次,结果还不知道自己究竟做了些什么,呵呵,够傻吧……
所以,建议没有这方面经验的读者,还是首先尝试一下手工创建的方法吧,而本章接下来的
内容,是送给曾经被它深深伤害而不想再次去亲历这项工作而又想提高交率而又在通用平台
上工作没有商业开发包的朋友。
建立交叉开发工具链
准备工具:
buildroot-0.9.27.tar.tar
只需要一个软件?
对,其它的不用准备了,buildroot事实上是一个脚本与补丁的集合,其它
需要用到的软件,如gcc、uClibc,你只需在buildroot中指明相应的版本,它会自动去给你
下载。
事实上,buildroot到网上去下载所需的所有工作是需要时间的,除非你的带宽足够,否
则下载软件时间或许会占去80%,而我在做这项工作之间,所需的工作链全部都在我本地
硬盘上,我解压开buildroot后,新建dl文件夹,将所有工具源码的压缩包拷贝进去,呵呵,
buildroot就不用去网上下载了。
我的软件清单:
Linux-libc-headers-2.4.27.tar.bz2
Gcc-3.3.4.tar.bz2
binutils2.15.91.0.2.tar.bz2
uClibc0.9.27.tar.bz2
genext2fs_1.3.orig.tar.gz
ccache-2.3.tar.gz
将它拷贝到${PRJROOT}/build-tools下,解压
[root@skynetbuild-tools]#tarjxvfbuildroot-0.9.27.tar.tar
[root@skynetbuild-tools]#cdbuildroot
配置它:
[root@skynetbuild-tools]#makemenuconfig
TargetArchitecture(i386)--->
选择硬件平台,我的是i386
Buildoptions--->
编译选项
这个选项下重要的是(${PRJROOT}/tools)Toolchainandheaderfilelocation?
编译好的工
具链放在哪儿?
如果你像我一样,所有工具包都在本地,不需它到网上自动下载,可以把wgetcommand
选项清空;
ToolchainOptions--->
工具链选项
---KernelHeaderOptions头文件它会自动去下载,不过应该保证与你将要用的内核是
同一个版本;
[]UsethedailysnapshotofuClibc?
使用最近的uClibc的snapshot
BinutilsVersion(binutils2.15.91.0.2)--->
Binutils的版本
GCCcompilerVersion(gcc3.4.2)--->
gcc版本
[*]Build/installc++compilerandlibstdc++?
[]Build/installjavacompilerandlibgcj?
支持的语言,我没有选择java
[]Enableccachesupport?
启用ccache的支持,它用于编译时头文件的缓存处理,
用它来编译程序,第一次会有点慢,但是以后的速度可就很理想了,呵呵……
---GdbOptions根据你的需要,选择gdb的支持
PackageSelectionforthetarget--->
这一项我没有选择任意一项,因为我打算根文件系统及busybox等工具链创建成工,
手工来做。
TargetOptions--->
文件系统类型,根据实际需要选,我用的ext2;
配置完成后,编译它:
[root@skynetbuild-tools]#make
这一项工作是非常花时间的,我的工具包全部在本地,也花去我一小时十三分的时间,如果
全要下载,我估计网速正常也要多花一两个钟头。
经过漫长的等待(事实上并不漫长,去打了几把游戏,很快过去了):
……
make[1]:
Leavingdirectory`/home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3'
touch-c/home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3/genext2fs
#-@find/home/skynet/build-tools/buildroot/build_i386/root/lib-typef-name\*.so\*|xargs
/home/skynet/tools/bin/i386-linux-uclibc-strip--remove-section=.comment
--remove-section=.note--strip-unneeded2>
/dev/null||true;
/home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3/genext2fs-i503-b1056\
-d/home/skynet/build-tools/buildroot/build_i386/root-q-D
target/default/device_table.txt/home/skynet/build-tools/buildroot/root_fs_i386.ext2
大功告成!
!
清点战利品
让我来看看它究竟做了哪些事情吧:
[root@skynetskynet]#cdtools
[root@skynettools]#ls
binbin-ccachei386-linuxi386-linux-uclibcincludeinfoliblibexecmanusr
bin:
所有的编译工具,如gcc,都在这儿了,只是加了些指定的前缀;
bin-ccache:
如果在Toolcha