嵌入式linux和linux区别 嵌入式linux( 三 )


那么 , 如何得到一个交叉工具链呢?是从网上下载一个“程序”然后安装就可以使用了吗?回答这个问题之前先思考这样一个问题 , 我们的交叉工具链顾名思义就是在PC机上编译出能够在我们目标开发平台比如ARM上运行的程序 , 这里就又有一个问题了 , 我们的ARM处理器型号非常多 , 难道有专门针对我们某一款的交叉工具链吗?若果有的话 , 可以想一想 , 这么多处理器平台 , 每个平台专门定制一个交叉工具链放在网络上 , 然后供大家去下载 , 想想可能需要找很久才能找到适合你的编译器 , 显然这种做法不太合理 , 且浪费资源!因此 , 要得到一个交叉工具链 , 就像我们移植一个Linux内核一样 , 我们只关心我们需要的东西 , 编译我们需要的东西在我们的平台上运行 , 不需要的东西我们不选择不编译 , 所以 , 交叉工具链的制作方法和系统移植有着很多相似的地方 , 也就是说 , 交叉开发工具是一个支持很多平台的工具集的集合(类似于Linux源码) , 然后我们只需从这些工具集中找出跟我们平台相关的工具就行了 , 那么如何才能找到跟我们的平台相关的工具 , 这就是涉及到一个如何制作交叉工具链的问题了 。
通常构建交叉工具链有如下三种方法:
方法一 : 分步编译和安装交叉编译工具链所需要的库和源代码 , 最终生成交叉编译工具链 。该方法相对比较困难 , 适合想深入学习构建交叉工具链的读者 。如果只是想使用交叉工具链 , 建议使用下列的方法二构建交叉工具链 。
方法二:通过Crosstool-ng脚本工具来实现一次编译 , 生成交叉编译工具链 , 该方法相对于方法一要简单许多 , 并且出错的机会也非常少 , 建议大多数情况下使用该方法构建交叉编译工具链 。
方法三 : 直接通过网上下载已经制作好的交叉编译工具链 。该方法的优点不用多说 , 当然是简单省事 , 但与此同时该方法有一定的弊端就是局限性太大 , 因为毕竟是别人构建好的 , 也就是固定的 , 没有灵活性 , 所以构建所用的库以及编译器的版本也许并不适合你要编译的程序 , 同时也许会在使用时出现许多莫名其妙的错误 , 建议读者慎用此方法 。
crosstool-ng是一个脚本工具 , 可以制作出适合不同平台的交叉编译工具链 , 在进行制作之前要安装一下软件:
$ sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk
crosstool脚本工具可以在下载到本地 , 然后解压 , 接下来就是进行安装配置了 , 这个配置优点类似内核的配置 。主要的过程有以下几点:
1. 设定源码包路径和交叉编译器的安装路径
2. 修改交叉编译器针对的构架
3. 增加编译时的并行进程数 , 以增加运行效率 , 加快编译 , 因为这个编译会比较慢 。
4. 关闭JAVA编译器  , 减少编译时间
5. 编译
6. 添加环境变量
7. 刷新环境变量 。
8. 测试交叉工具链
到此 , 嵌入式Linux系统移植四大部分的第一部分工作全部完成 , 接下来可以进行后续的开发了 。
第二部分:bootloader的选择和移植
01 Boot Loader 概念
就是在操作系统内核运行之前运行的一段小程序 。通过这段小程序 , 我们可以初始化硬件设备、建立内存空间的映射图 , 从而将系统的软硬件环境带到一个合适的状态 , 以便为最终调用操作系统内核准备好正确的环境 , 他就是所谓的引导加载程序(Boot Loader) 。
02 为什么系统移植之前要先移植BootLoader?
BootLoader的任务是引导操作系统 , 所谓引导操作系统 , 就是启动内核 , 让内核运行就是把内核加载到内存RAM中去运行 , 那先问两个问题:第一个问题 , 是谁把内核搬到内存中去运行?第二个问题:我们说的内存是SDRAM , 大家都知道 , 这种内存和SRAM不同 , 最大的不同就是SRAM只要系统上电就可以运行 , 而SDRAM需要软件进行初始化才能运行 , 那么在把内核搬运到内存运行之前必须要先初始化内存吧 , 那么内存是由谁来初始化的呢?其实这两件事情都是由bootloader来干的 , 目的是为内核的运行准备好软硬件环境 , 没有bootloadr我们的系统当然不能跑起来 。

秒懂生活扩展阅读