作 者:武力戡乱
修改日期:2017-09-13
备 注:
1、总备注信息
2、联系方式
3、其它博文链接:武力戡乱博客目录总表
4、转载地址:http://shumeipai.nxez.com/2013/10/09/raspberry-pi-kernel-cross-compiler.html#userconsent#
内 容:
Raspberry Pi本身的硬件性能不是很高,在pi上直接编译源代码,非常消耗时间,为了节省时间,所在在性能强的PC或server上进行交叉编译。前面介绍过普通应用程序的交叉编辑环境和操作过程,下面要更进一步,介绍系统内核(Kernel)的交叉编译。
参考文档: 官方文档
环境准备:
PC操作系统: ubuntu 12.04, 64bit
相关软件:
linux-rpi-3.6.y.zip linux源码
firmware-master.zip 固件依赖
tools-master.zip 交叉编译环境工具
获取方法
1
2
3
|
$ git clone git:
//github
.com
/raspberrypi/firmware
.git PRiFirmware
$ git clone git:
//github
.com
/raspberrypi/linux
.git RpiLinux
$ git clone git:
//github
.com
/raspberrypi/tools
.git RpiTools
|
由于下载比较慢,如果不升级的话,直接下载zip包靠谱一点。
步骤:(其实和直接编译内核步骤类似)
1 获取当前树莓派Kernel的.config文件,并进行自定义的配置,拷贝到PC上
2 在PC上执行
1
2
|
$
mv
.config
/RPiLinux
$
cd
RpiLinux/
|
编辑老的配置文件
1
|
$
make
ARCH=arm CROSS_COMPILE=..
/RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
oldconfig
|
如果需要添加新的模块
1
|
$
make
ARCH=arm CROSS_COMPILE=..
/RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
menuconfig
|
(官方提供的编译工具中包含三套工具链
arm-bcm2708hardfp-linux-gnueabi
arm-bcm2708-linux-gnueabi
gcc-linaro-arm-linux-gnueabihf-raspbian
我们选择带hardfp硬解码的工具。)
一路enter,选择默认值,可以看出里面包含不少对加载驱动的选取。
3 编译
1
|
$
make
ARCH=arm CROSS_COMPILE=..
/RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
-j4
|
-j标示cpu的核数,多核编译提高速度
这个过程可能需要二十分钟
最终,arch/arm/boot/zImage 就是我们所编译获得的文件。zImage 是 Compressed kernel image 文件,要转换为 kernel.img 还需要进一步处理。
1
2
|
$
cd
..
/RpiTools/mkimage/
$ .
/imagetool-uncompressed
.py ../..
/RpiLinux/arch/arm/boot/zImage
|
编译新lib:
新的Kernel要正确运行,还需要编译所需的module,主要对应“/lib”目录下的内容。编译时,使用“INSTALL_MOD_PATH”参数指定目标路径。
1
2
3
4
|
$
cd
../..
$
mkdir
modules
$
cd
RpiLinux/
$
make
modules_install ARCH=arm CROSS_COMPILE=..
/RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
INSTALL_MOD_PATH=..
/modules
|
备份 Firmware:
1
2
3
4
5
|
$
cd
..
$
mkdir
backup
$
sudo
mount
/dev/sdc1
/media/SD/
$
cd
/media/SD/
$
mv
*.elf *.bin ~
/gitpool/raspberrypi/backup/
|
升级RPi的kernel、Firmware、lib
1
2
3
4
5
6
7
|
$
cd
~
/gitpool/raspberrypi/RPiFirameware/boot
$
sudo
cp
~
/gitpool/raspberrypi/RpiTools/mkimage/kernel
.img kernel_new.img
$
cp
bootcode.bin fixup.dat fixup_cd.dat start.elf
/media/SD/
$
cd
..
/hardfp/opt/
$
sudo
umount
/media/SD
$
sudo
mount
/dev/sdc2
/media/SD/
挂在根分区
$
sudo
cp
-r vc/
/media/SD/opt/
|
将新的vc库复制到SD卡,因为之前选用的工具链是hardfp,所以现在所选用的vc库也是硬解码的版本(RPiFramware/hardfp/opt/vc)。
1
2
|
$
cd
../../..
$
sudo
cp
-r modules
/lib
/media/SD/
|
(注意这步直接cp就好,我之前为了备份/lib,把/lib目录mv成bak了,整个树莓派就没法用了。。)
将SD插回树莓派,可以看到其正常启动。至此树莓派新内核编译完成。
树莓派是很强大而且学习资料相当丰富的ARM平台,对学习linux内核是很有帮助的,并且做实验也是非常方便。