Linux驱动开发(四)---树莓派内核编译

前文回顾

《Linux驱动开发(一)—环境搭建与hello world》

《Linux驱动开发(二)—驱动与设备的分离设计》

《Linux驱动开发(三)—设备树》
继续宣传一下韦老师的视频

70天30节Linux驱动开发快速入门系列课程【实战教学、技术讨论、直播答疑】

在这里插入图片描述
不过受限于没有钱的烦恼,没去买那么贵的开发板,我决定用树莓派来继续驱动开发的学习。所以需要先搭建一个树莓派的开发环境,能够编译内核模块,并且能够修改DTS,才能进行下一步的学习。
Linux驱动开发(四)---树莓派内核编译_第1张图片

编译环境

我这里的宿主机安装的ubuntu18,64位的。安装好系统之后,需要安装一些必要软件

sudo apt update
sudo apt install net-tools
sudo apt-get install openssh-server
sudo apt-get install git
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

下面的步骤参考
官网说明,喜欢看英文的朋友可以移步这里,
Linux驱动开发(四)---树莓派内核编译_第2张图片

安装交叉编译工具

编译32位系统

sudo apt install crossbuild-essential-armhf

编译64位系统

sudo apt install crossbuild-essential-arm64

下载内核代码

git clone --depth=1 https://github.com/raspberrypi/linux

源码编译

我用的是3b+的板子,首先要生成配置文件,其实就是把默认配置拷贝过来。

cd linux
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

如果是其他的,
树莓派 1, Zero and Zero W, 树莓派 Compute Module 1:

cd linux
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

树莓派 2, 3, 3+ and Zero 2 W, and 树莓派Compute Modules 3 and 3+:

cd linux
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

树莓派 4 and 400, and 树莓派 Compute Module 4:

cd linux
KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig

然后根据配置文件进行编译全部内容

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

大概花了我一个多小时,虚拟机,单核2G,确实有点慢
Linux驱动开发(四)---树莓派内核编译_第3张图片

到此,编译内核的过程就完毕了。

内核替换

首先需要把SD卡通过读卡器接入ubuntu这个编译服务器,然后能看到sdb设备

pgg@ubuntu:~$ ls /dev/sd
sda   sda1  sdb   sdb1  sdb2 

Linux驱动开发(四)---树莓派内核编译_第4张图片

其中,sdb1是FAT文件系统(引导)分区,sdb2是ext4文件系统(根)分区。

然后分别挂载这两个设备,我这里用了绝对路径,和官方的不太一样。

mkdir -p /home/pgg/mnt
mkdir -p /home/pgg/mnt/fat32
mkdir -p /home/pgg/mnt/ext4
sudo mount /dev/sdb1 /home/pgg/mnt/fat32
sudo mount /dev/sdb2 /home/pgg/mnt/ext4

通过mount命令可以查看
在这里插入图片描述
然后将编译好的kernel模块安装到SD卡

32位系统安装命令:

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/home/pgg/mnt/ext4 modules_install

64位系统安装命令

sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/home/pgg/mnt/ext4 modules_install

最后,拷贝内核和设备树,

32位系统安装命令

sudo cp /home/pgg/mnt/fat32/$KERNEL.img /home/pgg/mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage /home/pgg/mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb /home/pgg/mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /home/pgg/mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README /home/pgg/mnt/fat32/overlays/
sudo umount /home/pgg/mnt/fat32
sudo umount /home/pgg/mnt/ext4

64位系统安装命令

sudo cp /home/pgg/mnt/fat32/$KERNEL.img /home/pgg/mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image /home/pgg/mnt/fat32/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /home/pgg/mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /home/pgg/mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /home/pgg/mnt/fat32/overlays/
sudo umount /home/pgg/mnt/fat32
sudo umount /home/pgg/mnt/ext4

另一种选择是将内核复制到同一个位置,但使用不同的文件名,例如kernel-a.img,并不是覆盖内核。
然后可以config.xt文件来选择Raspberry Pi将引导的内核:
例如
kernel=kernel-a.img

这样做的好处是将自定义内核与系统和任何自动更新工具管理的库存内核映像分开,并允许您在内核无法启动时轻松还原到库存内核。
就是一个内核选择启动
Linux驱动开发(四)---树莓派内核编译_第5张图片

最后插回SD卡,重启。

两个消息

一个好消息,系统成功启动,基本正常。
一个坏消息,无线网卡没有了,只能用有线连接网络。这个问题后边再查。不能耽误学习进度。
Linux驱动开发(四)---树莓派内核编译_第6张图片

结束语

今天的热门应该是前某大公司DD被罚了80个亿,理由是各种违法违规的操作,手机用户信息啥的,不过试想手机里哪个APP不是如此,连手机本身都成了窃听器了。
Linux驱动开发(四)---树莓派内核编译_第7张图片
不过人家也是无利不起早,只要我够穷,就不会被他们利用。
Linux驱动开发(四)---树莓派内核编译_第8张图片

你可能感兴趣的:(驱动开发,linux知识,操作系统,驱动开发,linux,树莓派,内核)