Linux交叉环境搭建
——乐百事
2017-3-10
1、 选择内核版本:拿到一个平台之前如何正确的选择合适的内核版本?
2、 选择好linux内核之后,如何选择交叉编译版本?
3、 多个交叉编译器如何自由切换
4、 交叉编译环境的搭建以及库环境的搭建
5、 内核编译如何指定交叉编译器,编译出想要的格式
6、 内核menuconfig如何配置,并针对平台指定CPU及外设
一、 选择内核版本
可以了解一下内核发布的历史:
内核版本号 |
时间 |
内核发展史 |
0.00 |
1991.2-4 |
两个进程分别显示AAA BBB |
0.01 |
1991.9 |
第一个正式向外公布的Linux内核版本 |
0.02 |
1991.10.5 |
Linus Torvalds将当时最初的0.02内核版本发布到了Minix新闻组,很快就得到了反应。Linus Torvalds在这种简单的任务切换机制上进行扩展,并在很多热心支持者的帮助下开发和推出了Linux的第一个稳定的工作版本。 |
0.03 |
1991.10.5 |
|
0.10 |
1991.10 |
Linux0.10版本内核发布,0.11版本随后在1991年12月推出,当时它被发布在Internet上,供人们免费使用。 |
0.11 |
1991.12.8 |
基本可以正常运行的内核版本 |
0.12 |
1992.1.15 |
主要加入对数学协处理器的软件模拟程序 |
0.95(0.13) |
1992.3.8 |
开始加入虚拟文件系统思想的内核版本 |
0.96 |
1992.5.12 |
开始加入网络支持和虚拟文件系统 |
0.97 |
1992.8.1 |
|
0.98 |
1992.9.29 |
|
0.99 |
1992.12.13 |
|
1.0 |
1994.3.14 |
Linux1.0版本内核发布,使用它的用户越来越多,而且Linux系统的核心开发队伍也建起来了。 |
1.2 |
1995.3.7 |
|
2.0 |
1996.2.9 |
|
2.2 |
1999.1.26 |
|
2.4 |
2001.1.4 |
Linux2.4.0版本内核发布。 |
2.6 |
2003.12.17 |
Linux2.6版本内核发布,与2.4内核版本相比,它在很多方面进行了改进,如支持多处理器配置和64位计算,它还支持实现高效率线和处理的本机POSIX线程库(NPTL)。实际上,性能、安全性和驱动程序的改进是整个2.6.x内核的关键。 |
2.6.15 |
2006 |
Linux2.6.15版本内核发布。它对IPv6的支持在这个内核中有了很大的改进。PowerPC用户现在有了一个用于64位和32位PowerPC的泛型树,它使这两种架构上的内核编辑成为可能。 |
2.6.30 |
2009.6 |
改善了文件系统、加入了完整性检验补丁、TOMOYO Linux 安全模块、可靠的数据报套接字(datagram socket)协议支持、对象存储设备支持、FS-Cache 文件系统缓存层、nilfs 文件系统、线程中断处理支持等等。 |
2.6.32 |
2009.12 |
增添了虚拟化内存 de-duplicacion、重写了 writeback 代码、改进了 Btrfs 文件系统、添加了 ATI R600/R700 3D 和 KMS 支持、CFQ 低传输延迟时间模式、perf timechart 工具、内存控制器支持 soft limits、支持 S+Core 架构、支持 Intel Moorestown 及其新的固件接口、支持运行时电源管理、以及新的驱动。 |
2.6.34 |
2010.5 |
添加了 Ceph 和 LogFS 两个新的文件系统,其中前者为分布式的文件系统,后者是适用于 Flash 设备的文件系统。Linux Kernel 2.6.34 的其他特性包括新的 Vhost net、改进了 Btrfs 文件系统、对 Kprobes jump 进行了优化、新的 perf 功能、RCU lockdep、Generalized TTL Security Mechanism (RFC 5082) 及 private VLAN proxy arp (RFC 3069) 支持、asynchronous 挂起恢复等等。 |
2.6.36 |
2010.10 |
Tilera 处理器架构支持、新的文件通知接口 fanotify、Intel 显卡上实现 KMS 和 KDB 的整合、并行管理工作队列、Intel i3/5 平台上内置显卡和 CPU 的智能电源管理、CIFS 文件系统本地缓存、改善虚拟内存的层级结构,提升桌面操作响应速度、改善虚拟内存溢出终结器的算法、整合了 AppArmor 安全模型(注:与 SELinux 基于文件的标注不同, AppArmor 是基于路径的)。 |
不提倡用最新的内核版本,也不提倡用很老且失去维护的版本。
Linux内核有很多版本,从2.X到现在的4.X,每一次的升级改动都可能带来很大的变化,内核中细小的改动可能会造成你现在的编译器版本(包括交叉编译器)无法正常编译此内核。
Linux的各个版本的内核从共享出来到稳定都有人一直在维护,从每个版本维护时间来确定对应版本的内核是否适合自己。参考地址如下:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/refs/heads
采用平台MYD-4378开发板,开发板提供的3.12.10的kernel,从官网下载3.12.71最新的kernel。
注解:同样选择3.12.X版本的,便于对比学习。
二、 选择交叉编译版本
开发板上用的主芯片是TI的AM4378,到TI官网上查看SDK包,如下图所示。
可以看到提供了三种SDK包,Linux、Linux-RT、RTOS。其中Linux-RT也属于RTOS实时系统,我们要跑Linux系统就下载Linux的SDK。
我们参考下载txt中提到的内容:
可以看到已经从TI这款芯片的官网上下载了gcc6.2的交叉编译器。
可以看到下面链接中提到的版本信息,可以作为参考,也可以按照推荐的版本下载对应的源码版本。
注:很多平台厂家会提供SDK环境,可以通过SDK安装的环境,编译u-boot或者kernel,通过查看编译出来的文件,来确定平台厂家具体用的那种类型的编译器,例如:
可以看到用到的就是LinareGCC 7.2版本的交叉编译器,这样就可以找到编译器的官网进行下载编译器或者寻找更新的编译器。https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabihf/
三、 搭建交叉编译环境
安装上一章中下载的bin文件,在linux地下执行安装bin文件报错,file看一下文件属性为ELF 64-bit LSB executable,我的ubuntu系统是uname -a看是32位,没办法法执行这个bin,看来得升级到64位的ubuntu。
从官网选定版本ubuntu-14.04.5-desktop-amd64.iso下载安装。
Step1、在终端root模式下执行下载的bin文件,选择解压的位置,解压之后的目录里面有setup.sh脚本,执行这个脚本搭建开发环境。
注:解压完需要安装,我就不安装了,装个编译器就行了
Step2、下载官网的gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf.tar.xz,解压到/usr/local/arm/目录,并添加到PATH环境变量中。
Step3、查看交叉编译器版本,如下图所示,表示交叉编译环境搭建成功。
四、 多个交叉编译器的自由切换
看了网上很多人都是直接改profile文件来让PATH生效,这种方法局限性就是普通用户登录进系统su root切换到root会导致PATH还原,而且不便于多个交叉编译器的自由切换,所以我选择制作脚本,脚本加一些易于识别的参数传递,通过source执行脚本来自由切换交叉编译器。这里要注意的是设置环境变量的脚本直接./执行是不生效,要通过source执行才可以。
注解:sh和./执行的脚本是在子任务中执行的脚本,执行结果不会反应到当前终端,举个例子,当前终端所在目录为/home/目录,采用sh或./执行一个脚本cd到/根目录,脚本执行的结果不会影响当前终端,当前终端还在/home目录,但是如果用source来执行这个脚本的话,当前终端也会变到/根目录。切换root用户可以su -方式将环境变量也配置到root用户。
下面可以贴一下我的脚本实现的功能:
设定清除参数clean:还原PATH的变量
检索路径并设定路径:检索设置交叉编译器路径,空目录不予设置PATH
脚本内容如下:
#!/bin/bash
if [ $BK_SUC];then
echo "readyto set PATHBK=$PATHBK !!!"
exportPATH=$PATHBK
else
echo "firstbackup PATH=$PATH !!!"
exportPATHBK=$PATH
fi
exportBK_SUC="lebaishi"
if [ $# -ne 1 ] ;then
echo "Pleaseenter 'one' parameter !!!"
echo "nowexit !!!"
#exit 1;
#fi
elif ["$1" = clean ];then
echo "recoverthe PATH=$PATHBK !!!"
exportPATH=$PATHBK
elif [ ! -d"$1" ];then
echo "Pleaseenter a valid directory !!!"
else
echo "now setthe PATH=$PATH:$1"
exportPATH=$PATH:$1
fi
五、 指定交叉编译
交叉编译可以安装多个,但是同一时刻同一终端下,只有一个交叉编译器可以正常工作。
编译内核的时候,首先确认PATH环境变量包含了交叉编译器的目录。
在内核源码的根目录下有Makefile文件,里面的ARCH和CROSS_COMPILE环境变量指定编译器。可以直接修改Makefile里面的ARCH和CROSS_COMPILE指向arm和arm-linux-gnueabihf- 这样编译时候就会自动链接到当前的交叉编译器上。除了修改Makefile也可以直接在make的后面加上ARCH和CROSS_COMPILE的赋值。
六、 配置内核
在内核menuconfig菜单中,system type->ARM system type里面选择芯片支持,并完善后续的配置支持。
make allnoconfig:创建最小配置内核,这样配置的内核仅选中必选项,其他都不选的最小配置。