参考文章
1. 配置交叉编译环境
之前在ubuntu上配置过了,直接跳过
2.获取Linux内核源码
Linux内核源码链接
3.Linux内核源码的配置
参考文章
厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码
第一种方式:
cp 厂家.config .config
第二种方式:
make menuconfig 一项项配置,通常是基于厂家的config来配置
第三种方式:
完全自己来
我使用的是第一种根据厂家提供的.config文件来进行配置
1)内核配置:
首先要进入到Linux内核源码的目录里面
获取bcm2711_defconfig的配置到 .config里。
树莓派4b配置的是bcm2711_defconfig
树莓派3b则是bcm2709_defconfig
执行
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2711_defconfig
2)驱动的配置
sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
然后会弹出这样的一个框图
可以进行内核驱动的一些相关配置
如果没有什么改的,可以不用执行这一步
4.编译和打包内核源码
1)编译
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
sudo apt install libssl-dev
然后编译成功了
*注意:编译成功后,看到源码树目录多了vmlinux,失败则无此文件
成功后,目标zImage镜像arch/arm/boot底下
*
2)打包zImage成树莓派可用的xxx.img
参考文章
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
在这里出现了bug
提示:ash: ./scripts/mkknlimg: No such file or directory
没有打包工具mkknlimg,尝试了很多方法都不行,后来发现打包工具mkknlimg被淘汰了
方法1:重新下载一个老版本的源码Linux-rpi-4.14.y.zip,unzip解压,在文件夹scripts里找到打包工具mkknlimg,将该打包工具拷贝到现在源码的scripts目录下
方法2:下载tool_master工具包找到imagetool-uncompressed.py
sudo ./imagetool-uncompressed.py 内核源码目录的绝对路径/arch/arm/boot/zImage
打包成功后,在源码目录下课以找到kernel_new.img这个文件
5.挂载树莓派sd卡,并安装编译好的内核源码到sd卡
1)先建立两个空文件夹,方便挂载sd卡
mkdir data1 data2
dmesg查看内核打印信息如出现 sdb1 sdb2,则继续下列操作
挂载U盘
sudo mount /dev/sdb1 data1 一个fat分区,是boot相关的内容,kernel的img
sudo mount /dev/sdb2 data2 一个是ext4分区,也就是系统的根目录分区。
以下用[fat]表示boot挂载的路径,[ext4]表示ext4挂载的路径。
2)安装modules, 设备驱动文件
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install
操作ext4分区,需要root权限。
3)安装更新 kernel.img 文件,注意镜像名字是kernel7.img
更新之前先备份,防止更换内核后树莓派启动失败,找不回原先的内核
```bash
cd [fat]
cp kernel7.img kernel7old.img
前面已经用 mkknlimg 工具打包了kernel_new.img文件了,把它复制到boot分区并配置使用即可
cp kernel_new.img [fat]/
然后编辑 [fat]/config.txt 文件,在最后加入一行:
kernel=kernel_new.img
也可以把编译新生成的拷贝到[fat]/中,起名kernel7.img
cp kernel_new.img [fat]/kernel7.img
这种的话直接不用修改[fat]/config.txt 文件
4)复制其他相关文件
sudo cp arch/arm/boot/dts/*.dtb [fat]/
sudo cp arch/arm/boot/dts/overlays/*.dtb* [fat]/overlays/
sudo cp arch/arm/boot/dts/overlays/README [fat]/overlays/