最近发现一个专门的用树莓派学内核的仓,空了瞅瞅。
==================================================
1 前言
主要是想学一下Linux内核,所以搭一套环境,其实有几个选择,好几个都是我买了板子的。
首先是正点原子的RK3568,最早是想弄安卓,但是SDK的大小真的把我劝退了,动不动几百个G的空间,还有就是保底16个G的内存。我买的云可没那么豪华的配置。配套的Linux环境也不算小。不过也有好处,配套的中文资料挺多的。可以作为备选。
然后就是Openwrt。说实话,Openwrt也是不错的选择,资料也不少,搞得熟练了就靠这个找个活干也是稳稳的,但是Openwrt没有太合适的开发板。。。
还有一个就是之前买的一本linux驱动的书,是华清远见出的,配套的是一个三星arm的Exynos4412板子,但是看了下那个板子要500块。而且感觉小众了点。
最后还是选的树莓派,本来是买了一个树莓派Zero 2W,价格不贵100大元。资料多而且空间占用小。结果后面又在家里翻出来一个树莓派3B,查了一下7年前买的3B性能比Zero还强了不少,还有显示的DSI接口,摄像头的CSI接口,真是搞边缘计算的一把好手。于是火速把zero又给退了,还是用3B。姑且就叫它黄忠吧。。。

整个空间只用了1.8G,编译时间也能接受。唯一有点缺点就是没有现成的基于树莓派驱动开发的书,起码现在我还没看到。这个我想能克服吧。

其实最后还有个隐藏选项,就是现在单位用的高通。但是那堆垃圾我是真的无力吐槽,一套SDK700G,编译5个小时打底。真的是极不友好,火速劝退。
2 编译过程以及踩的坑
安装的软件除了arm交叉编译工具,还有
sudo apt install bc bison flex libssl-dev make
下载代码还是很easy
sudo apt-get install git bc bison flex libssl-dev make
git clone --depth=1 https://github.com/raspberrypi/linux
KERNEL=kernel7
make bcm2709_defconfig
make -j$(nproc) zImage modules dtbs
但是我这里遇到两个坑。
1 是说在x86下面找不到bcm2709_defconfig,看了一下原来是平台没选。我是直接改的根Makefile,改了个
ARCH ?= arm
或者直接用官方方案:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
注:
bcm2709_defconfig是32位
bcm2711_defconfig是64位。
2 交叉编译环境有点问题
找到arm gcc的位置,expert一下就可以了。
export CROSS_COMPILE=/usr/bin/arm-linux-gnueabihf-
这样编译就没啥问题了。下面这个是编译命令:
make ARCH=arm -j$(nproc) zImage modules dtbs
看编译命令,这里有3个部分。zImage modules dtbs
| zImage | 生成内核镜像 |
| modules | 要生成驱动模块 |
| dtbs | 生成设备树配置文件 |
内核镜像,之前写过一篇:嵌入式Image小总结_img嵌入式命令-CSDN博客
然后就是拷贝生成的文件,这里把tf卡挂载到本地:
mkdir mnt
mkdir mnt/boot
mkdir mnt/root
sudo mount /dev/sdb1 mnt/boot
sudo mount /dev/sdb2 mnt/root
拷贝命令如下:
sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage mnt/boot/$KERNEL.img
sudo cp arch/arm/boot/dts/broadcom/*.dtb mnt/boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/boot/overlays/
sudo umount mnt/boot
sudo umount mnt/root
这里说一下现在网上资料看到的大坑,就是上面的第三行。查一下树莓派官网是这样写的:
For kernels up to version 6.4:
$ sudo cp arch/arm/boot/dts/*.dtb mnt/boot/For kernels version 6.5 and above:
$ sudo cp arch/arm/boot/dts/broadcom/*.dtb mnt/boot/
也就是说对于6.5版本以后的内核,都是下面这个。但是几乎网上9成的资料,都是上面那个,一开始像我这样不熟悉的话就懵了。
然后把tf卡插回到树莓派,就可以开始愉快的玩耍了。

=============================================================
3 不能遗漏的大坑
基本上所有的资料,包括树莓派官网都是这样写的,上面的操作完了后,就可以愉快的玩耍了。但是是真的吗?我告诉你,这个是不行的。上面的图是出不来的!
因为缺了东西!
这个东西就是文件系统,bootloader,配置文件等一堆。只是编译出来上面那堆东西,是根本不能正常运行的,因为一个启动盘有两个部分,一个是boot,是FAT32格式,包含了内核和驱动。一个是root,是EXT4格式。这部分是文件系统。但是绝大多数网上的内容没有讲怎么做这个。

之前写过一篇busybox,感觉可以用来做这个文件系统化,有空再研究吧。BusyBox-CSDN博客
bootloader和配置文件在fat32分区中,bootcode.bin和start.elf是闭源的,也就是说自己是怎么也倒腾不出来的,后面我可能把它换成uboot。内容如下:
bootcode.bin:这是树莓派的第一阶段启动加载程序。start.elf:这是GPU固件,负责加载和启动内核。config.txt:这是树莓派的配置文件,用于设置各种启动参数。cmdline.txt:这是内核命令行参数文件。
现在有一个偷懒的办法,从官网下载做好的刷机包。https://www.raspberrypi.com/software/operating-systems/
因为我是树莓派3B,资源有限,所有下载的这个。

下载之后使用工具烧写到TF卡中。
这个是官方的,最好。
https://www.raspberrypi.com/software/
这个也可以,Win32 Disk Imager(Win32 Disk Imager )

之后才有了一个完整启动盘。以这个启动盘做基础,换成自己编的内核,才能顺利启动。

4 其它注意事项
再说一下远程环境的折腾。以为树莓派的系统SD卡在windows上只能识别boot分区。只能上ubuntu。
我一开始是实在不想装虚拟机,于是用的现有的ubuntu远程云服务器来做,编译倒是很顺利,但是几乎网上所有的教程,都是树莓派官网的变种,必须要将TF卡挂载上去mount。我实在不清楚windows上的TF卡怎么挂载到远端云,所以只有本地装了一个ubuntu虚拟机。
结果又是一堆服务要在本地services.msc开,也是折腾了好久。

其实如果熟悉了上面拷贝的内容,单纯只是内核,还是可以在远端服务器做。boot分区是FAT32格式,所有直接拷贝回windows机器即可。
但是root分区文件系统还没想好怎么在windows上弄,默认的ext4在windows上挂载感觉有点麻烦。
对了,要使用串口的话,要在烧写好的TF卡中进行修改。
修改根文件夹下面的config.txt。增加这两句:
enable_uart=1
dtoverlay=pi3-disable-bt
接线挂这几个:

最后就是现在2024以后的官方固件,使用以前的pi和raspberry都没法登录了。要改一下,增加一个userconf.txt,内容是
pi:$6$/4.VdYgDm7RJ0qM1$FwXCeQgDKkqrOU3RIRuDSKpauAbBvP11msq9X58c8Que2l1Dwq3vdJMgiZlQSbEXGaY5esVHGBNbCxKLVNqZW1
这样才可以使用以前的pi和raspberry登录。
配置wifi,不知道是我板子的问题还是系统的问题,用网上的方式就是不行,最后只有这个命令可以。
nmcli --ask dev wifi connect <ssid> password <password>
更新于10.4,关于wifi,今天看了下树莓派手册。确实只能用nmcli命令了。X的,过时资料害死人啊。
https://www.raspberrypi.com/documentation/computers/configuration.html#connect-to-a-wireless-network
5 参考
Raspberry Pi 树莓派内核:从硬件到软件的完美融合,驱动丰富硬件,打造全能平台
【从零到一的Raspberry】数莓派踩坑实录(二) 内核编译配置和模块安装_l树莓派修改kernel7.img后无法启动-CSDN博客
https://www.raspberrypi.com/documentation/computers/linux_kernel.html#build-the-kernel

2380

被折叠的 条评论
为什么被折叠?



