树莓派上的操作
1.升级到最新版内核保证与下载的内核源码版本一致
1 |
$ sudo rpi-update |
2.升级完整后重启
1 |
$ sudo reboot |
3.查看内核版本
1 |
$ uname -r |
4.把最新版本的内核配置保存到.config中,以备以后编译内核使用
1 |
$ sudo modprobe configs |
文件被存储到了/proc/config.gz
中。
目前最新版本是4.4.12,因此下面的编译都是针对4.4.y这个分支进行的。
Debian/Ubuntu下编译
1.获取内核源代码
1 2 3 4 5 |
$ cd ~ $ mkdir rpi $ cd rpi |
2,以下步骤时间很长,可以在睡觉前执行,并且可能需要重试几次才行,建议同时开三个Shell
一起执行。
1 2 3 4 5 6 7 |
# core.symlinks=true 软连接处理,否则会出现各种找不到文件的问题 $ git -c core.symlinks=true clone https://github.com/raspberrypi/firmware.git rpi-firmware $ git -c core.symlinks=true clone https://github.com/raspberrypi/linux.git rpi-linux $ git -c core.symlinks=true clone https://github.com/raspberrypi/tools.git rpi-tools |
3.给予整个rpi-tools目录执行权限,默认可能没有执行权限
1 |
$ chmod +x -R rpi-tools |
4.整个的rpi-linux的文件夹的所有者更改为当前用户,否则存在一定程度的编译问题,特别是代码从其他系统上拷贝过来的情况
1 |
$ sudo chown -R `whoami` rpi-linux/ |
5.设置编译器的路径
1 |
$ export PATH=$PATH:~/rpi/rpi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin |
6.配置编译类型
1 2 3 4 5 6 7 8 |
$ cd rpi-linux/ # 检出分支 $ git checkout rpi-4.4.y $ KERNEL=kernel $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig |
如果提示是否增加新的驱动支持,默认全部选择否(输入大写的字母N
,小写字母无效),否则会导致无法编译通过。
7.开始正式编译内核,最后的数字改成比你的CPU核心数量+1以提交多线程编译效率。
1 2 3 |
$ make clean $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j5 |
8.编译错误修正,如果提示如下错误
1 2 3 4 5 6 7 8 9 10 11 |
DTC arch/arm/boot/dts/bcm2708-rpi-b.dtb In file included from arch/arm/boot/dts/bcm2708.dtsi:1:0, from arch/arm/boot/dts/bcm2708-rpi-b.dts:3: arch/arm/boot/dts/bcm2708_common.dtsi:1:39: fatal error: dt-bindings/clock/bcm2835.h: 没有那个文件或目录 #include "dt-bindings/clock/bcm2835.h" ^ compilation terminated. scripts/Makefile.lib:293: recipe for target 'arch/arm/boot/dts/bcm2708-rpi-b.dtb' failed make[1]: *** [arch/arm/boot/dts/bcm2708-rpi-b.dtb] Error 1 arch/arm/Makefile:340: recipe for target 'dtbs' failed make: *** [dtbs] Error 2 |
这个现象的原因是 git 在检出代码的时候,没有正确处理软连接,我们只需要重新处理一次即可。如下:
1 2 3 4 5 |
# 软连接处理,否则会出现各种找不到文件的问题 $ git config core.symlinks true $ git reset --hard |
9.查看生成的内核镜像文件
1 |
$ cd rpi-linux/arch/arm/boot |
生成的zImage就是我们需要的kernel.img
。
10.编译modules
1 2 3 4 5 6 7 |
$ cd ../.. $ mkdir modules $ cd rpi-linux $ make modules_install ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=../modules -j5 |
安装编译好的内核
Ubuntu
下面,SD
卡会自动挂载,默认挂载到了/media/
目录下面,如果是使用NOOBS
安装的话,系统目录是固定的,执行如下命令拷贝到目标SD
卡上面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ mv /media/`whoami`/boot/kernel.img /media/`whoami`/boot/kernel_old.img $ cp rpi-linux/arch/arm/boot/zImage /media/`whoami`/boot/kernel.img $ mv /media/`whoami`/boot/bootcode.bin /media/`whoami`/boot/bootcode_old.bin $ mv /media/`whoami`/boot/fixup.dat /media/`whoami`/boot/fixup_old.dat $ mv /media/`whoami`/boot/fixup_cd.dat /media/`whoami`/boot/fixup_cd_old.dat $ mv /media/`whoami`/boot/start.elf /media/`whoami`/boot/start_old.elf $ cd rpi-firmware/boot $ cp bootcode.bin fixup.dat fixup_cd.dat start.elf /media/`whoami`/boot/ |