摘要:
最近在学习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
下载源码和交叉编译工具链: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后,查看分区:
安装模块:
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
【强势推荐此博客,结合我的和这篇博客,理解更好】