参考的博文:https://blog.youkuaiyun.com/nicekwell/article/details/78482833
1.准备条件:
1.1交叉编译工具
1.1.1交叉编译工具的下载:
https://github.com/raspberrypi/tools 交叉编译工具链(仅在交叉编译时用到)
.
1.1.2 解压交叉编译工具
unzip tool-master.zip
.
1.1.3 建立一个软链接
进入到解压出来的文件的这个目录里:“/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/”
然后开始建立软链接
提一点:这里名字都是直接参照树莓派原本目录里的样子
ln -s arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcc-4.8.3
//ln 就是命令,应该是link这个单词来的吧,容易记
//-s 这个参数是说明是软链接,去掉这个-s就是建立的硬链接,至于软硬链接的区别自行百度
//arm-linux-gnueabihf-gcc-4.8.3 这个才是真正用到的
//arm-linux-gnueabihf-gcc 这个就是软链接的名字
.
1.1.4 添加环境变量
因为后面经常会用到这个交叉编译,所以这里就直接弄个永久的环境变量了(永久的意思其实就是修改配置文件,使每次打开sh都自动把环境变量改为我想要修改的那样)
首先查看当前环境变量:
echo $PATH
在查看当前建立好的软链接所在的路径:PWD
再来修改环境变量:
打开工作目录下的“.bashrc”文件
vi /home/.bashrc
在最后一行添加:
export PATH=[上面查看到的原本的PATH]:[建立好的软链接所在的路径]
例如:
到这里,交叉编译就安装好了。
.
.
1.2下载并解压源码
https://github.com/raspberrypi/linux 内核源码
自行选择版本
.
.
.
2.编译
1.驱动代码的编写
2.驱动代码的编译需要一个提前编译好的内核
3.编译内核就必须配置
4.配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核
但实际上,站在我们自己的角度来看,其实就是:通常厂家都会配linux内核源码给客户,比如说买了树莓派,厂家就会配个树莓派linux内核源码给你,而客户就可以根据自己的需求来编辑“.config”文件,配置好“.config”文件后,Makefile就会根据客户配置的“.config”文件来组织Linux内核,而Makefile的这个过程就是编译!
.
2.1配置“.config”文件
配置“.config”文件的方式:
第一种方式:cp 厂家.config .config
第二种方式:make menuconfig 一项项配置,通常是基于厂家的config来配置
例子:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
//ARCH=↓↓↓
----------------------------
//arm指定架构 |
//CROSS_COMLIE=指定编译环境 |
//KERBEL=指定内核 |
----------------------------
//make menuconfig 才是命令
第三种方式:完全自己来
.
而像我这种菜鸡,第二,第三种方式就暂时不用想了,先直接用第一种就好了。
那么,就直接进入第一种方式:
首先,CP厂家给的“.config”文件,但我这里不直接CP,但还是按照厂家的那样配置:
1.进入解压好的源码目录
2. 执行下面的代码:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
//这里的bcm2709_defconfig可以在源码的“/linux-rpi-4.14.y/arch/arm/configs”目录下看到
到这里就可以看到了已经生成了“.config”文件了
不过这个文件时隐藏文件,所以要用 ls -al 命令才能看到
然后我发现,上面那个ARCH=。。。那句命令不需要到放defconfig的目录才能执行,只要在这个源码的目录内就可以了,但目录外行不行我没试过。
到这里".config"文件就已经配置好了!
.
2.2编译树莓派内核
既然已经配置好了“.config”,那么接下来就是编译了
执行命令:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
//-j4 用多少电脑资源来编译,可以时j6,j8,都可以
//zImage 生成zImage文件
//modules 生成驱动模块
//dtbs 生成dtbs文件
编译成功后,看到源码树目录多了vmlinux,失败则无此文件
成功后,目标zImage镜像arch/arm/boot底下
打包zImage成树莓派可用的xxx.img
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
然后就可以在目录下看到打包好的树莓派内核了。