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]:[建立好的软链接所在的路径]

例如:

arm openresty 编译_arm openresty 编译

到这里,交叉编译就安装好了。

.

.

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”目录下看到

arm openresty 编译_交叉编译_02

到这里就可以看到了已经生成了“.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

arm openresty 编译_arm openresty 编译_03

然后就可以在目录下看到打包好的树莓派内核了。