树莓派3b 编译内核之交叉编译

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/windsnow1/article/details/87906931

树莓派3b 编译内核之交叉编译

摘要:
最近在学习GNU/Linux的内核驱动编程,使用的硬件平台是树莓派Raspberry Pi 3 Model B V1.2。树莓派部署的操作系统是基于Linux的 Raspbian,提供下载链接:https://www.raspberrypi.org/downloads/raspbian/123
但是树莓派的系统没有提供Linux内核源码,无法在树莓派上进行内核编译以及驱动程序的编译。

官网:https://www.raspberrypi.org/documentation/linux/kernel/building.md
提供了本地编译和交叉编译这两种方法,本地编译是在树莓派环境上编译Linux内核源码,因为嵌入式平台资源有限,能力有限,比较费时。这里,我们推荐使用交叉编译来实现。交叉编译借助于第三方平台,来编译Linux源码,而这个编译过程是生成树莓派ARM架构的内核代码,最后把结果移植到树莓派上。

我们使用的交叉编译平台是:个人PC 虚拟机上的Ubuntu_16.04.5 64位系统。

前期准备:
查树莓派Linux内核版本,以便下载对应的内核源码(这一步很重要,下载的源码一定要和树莓派Linux内核版本一致)。

uname -a
可以看到我们的Linux内核版本是4.14.79-v7+。

下载源码和交叉编译工具链:https://github.com/raspberrypi/
所以:我下载的文件保存的是: linux-rpi-4.14.y.zip, tools-master.zip。

交叉编译工具链环境搭建
在个人PC Ubuntu虚拟机环境下进行如下操作:

#进入主用户目录
cd ~
#创建工作文件夹
sudo mkdir raspberry_src
#进入工作文件夹目录
cd raspberry_src
#拷贝 tools-master.zip 并解压
#sudo unzip  tools-master.zip

在tools-master/arm-bcm2708下有五个交叉编译工具:

arm-bcm2708hardfp-linux-gnueabi
arm-bcm2708-linux-gnueabi
arm-rpi-4.9.3-linux-gnueabihf
gcc-linaro-arm-linux-gnueabihf-raspbian
gcc-linaro-arm-linux-gnueabihf-raspbian-x64

我们的Ubuntu 是x64位的环境,仅仅配置好gcc-linaro-arm-linux-gnueabihf-raspbian-x64的环境变量即可。

加入环境变量

sudo gedit /etc/profile

编辑内容:

#末尾添加:
export PATH=$PATH:$HOME/raspberry_src/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
#source 生效
source /etc/profile

交叉编译工具测试环境变量是否配置好:

arm-linux-gnueabihf-gcc -v
出现上图框选内容,表示环境变量配置成功。

内核源码编译
PC虚拟机Ubuntu环境下首先进行如下操作:

#进入工作目录下
cd ~/raspberry_src
#拷贝linux-rpi-4.14.y.zip到目录下 并解压
sudo unzip linux-rpi-4.14.y.zip

树莓派环境下:获取内核配置文件

sudo modprobe configs

在树莓派文件系统/proc目录下,将config.gz文件拷贝到Ubuntu环境下。

个人PC 虚拟机Ubuntu环境下 :拷贝config.gz 到 ~/raspberry_src/linux-rpi-4.14.y/下:

sudo cp ~/Desktop/config.gz ~/raspberry_src/linux-rpi-4.14.y/

然后linux-rpi-4.14.y/ 执行以下操作:

zcat config.gz > .config

个人PC 虚拟机Ubuntu环境下开始编译内核:

KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
make ARCH=arm CROSS_COMPILE=/home/dr/raspberry_src/tools-master/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -j4 zImage modules dtbs

部署到SD卡
将树莓派关机,然后拔出SD,连接PC笔记本,进入Ubuntu虚拟机环境下:
树莓派SD卡连接PC前,查看分区:

lsblk

树莓派SD卡连接PC后,查看分区:

我们发现SD卡已经挂载/media/dr/目录下了。

安装模块:

cd ~/raspberry_src/linux-rpi-4.14.y/
sudo make ARCH=arm CROSS_COMPILE=/home/dr/raspberry_src/tools-master/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/dr/rootfs modules_install

拷贝内核文件:

scripts/mkknlimg arch/arm/boot/zImage /media/dr/boot/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb /media/dr/boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /media/dr/boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /media/dr/boot/overlays/

最后,拔出SD卡,插入树莓派启动。

结论:的确是实现了交叉编译内核,但是仍然有一些问题没有解决,譬如怎么在交叉编译平台编译生成驱动模块,然后在树莓派上进行加载等等。希望能得到大佬的指点和帮助。

参考文献:
https://blog.csdn.net/u010833052/article/details/78481973#commentBox
https://blog.csdn.net/u014695839/article/details/83720145
【强势推荐此博客,结合我的和这篇博客,理解更好】

猜你喜欢

转载自blog.csdn.net/windsnow1/article/details/87906931