[树莓派内核学习] kernel编译

本文章是在 http://www.xiehaichao.com/articles/173.html的基础上改动的。


环境准备:
交叉编译操作系统: linux_x86虚拟机
arm-linux存储介质:tf卡(预先装过debian并且运行过,这时tf卡上有两个分区:boot与(另一个分区)。最后将tf卡用读卡器连电脑,挂到虚拟机的usb上)


相关资源包:
linux-rpi-3.12.y.tar.gz   linux源码
firmware-master.tar.gz   固件依赖
tools-master.tar.gz     交叉编译环境工具
获取方法:(不推荐使用这种方法)
$ 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
由于下载比极慢,推荐使用*.tar.gz 包
下载地址:
https://github.com/raspberrypi/linux/archive/rpi-3.12.y.tar.gz
https://github.com/raspberrypi/firmware/archive/firmware-master.tar.gz
https://github.com/raspberrypi/tools/archive/tools-master.tar.gz


步骤:(其实和直接编译内核步骤类似)
1、获取当前树莓派Kernel的.config文件,并进行自定义的配置,拷贝到PC上
在树莓派上执行:
$cd ~
$cp /proc/config.gz .
然后将config.gz复制到电脑端


2、在PC上执行
$ zcat config.gz > .config
$ mv .config /RPiLinux
$ cd RpiLinux/
编辑老的配置文件
$ make ARCH=arm CROSS_COMPILE=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- oldconfig
如果需要添加新的模块
$ 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、编译
$ make ARCH=arm CROSS_COMPILE=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- -j4
-j标示cpu的核数,多核编译提高速度
这个过程可能需要二十分钟(2代i5笔记本4g内存,用了1小时)

最终,arch/arm/boot/zImage 就是我们所编译获得的文件。zImage 是 Compressed kernel image 文件,要转换为 kernel.img 还需要进一步处理。
$ cd ../RpiTools/mkimage/
$ ./imagetool-uncompressed.py ../../RpiLinux/arch/arm/boot/zImage

编译新lib:
新的Kernel要正确运行,还需要编译所需的module,主要对应”/lib”目录下的内容。编译时,使用“INSTALL_MOD_PATH


”参数指定目标路径。
$ 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:
$ cd ..
$ mkdir backup
$ cd /media/boot/
$ mv *.elf *.bin ~/gitpool/raspberrypi/backup/
$ cp *.dat *.img ~/gitpool/raspberrypi/backup/

升级RPi的kernel、Firmware、lib
$ 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/boot/
$ cp kernel_new.img /media/boot/
$ mv /media/boot/kernel.img kernel.img.bak
$ mv /media/boot/kernel_new.img kernel.img
$ cd ../hardfp/opt/
$ sudo cp -r vc/ /media/(另一个分区)/opt/


将新的vc库复制到tf卡,因为之前选用的工具链是hardfp,所以现在所选用的vc库也是硬解码的版本(RPiFramware/hardfp/opt/vc)。
$ cd ../../..
$ sudo cp -r modules/lib /media/(另一个分区)/   
(注意这步直接cp就好,我之前为了备份/lib,把/lib目录mv成bak了,整个树莓派就没法用了。)
将SD插回RPi,可以看到其正常启动。至此树莓派新内核编译完成。

猜你喜欢

转载自blog.csdn.net/u010398378/article/details/39611093