Linux内核学习2--搭建基于树莓派的Linux内核学习环境

最近发现一个专门的用树莓派学内核的仓,空了瞅瞅。

GitHub - s-matyukevich/raspberry-pi-os: Learning operating system development using Linux kernel and Raspberry Pi

==================================================

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。内容如下:

  1. bootcode.bin:这是树莓派的第一阶段启动加载程序。
  2. start.elf:这是GPU固件,负责加载和启动内核。
  3. config.txt:这是树莓派的配置文件,用于设置各种启动参数。
  4. 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

Interactive map of Linux kernel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值