树莓派linux内核源码编译

打印 上一主题 下一主题

主题 1032|帖子 1032|积分 3096

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Raspberry Pi 内核 托管在 GitHub 上;更新滞后于上游 Linux内核,Raspberry Pi 会将 Linux 内核的恒久版本整合到 Raspberry Pi 内核中。
1 构建内核

操作体系随附的默认编译器和链接器被设置为构建在该操作体系上运行的可执行文件。原生编译利用这些默认编译器和链接器。交叉编译是为运行编译过程的目标之外的目标编译代码的过程。Raspberry Pi 内核的交叉编译允许从 32 位操作体系构建 64 位内核,反之亦然。也可以从 Raspberry Pi 以外的设备交叉编译 32 位或 64 位 Raspberry Pi 内核。
1.1 下载内核源代码

下载最新 Raspberry Pi 内核的源代码:
  1. git clone --depth=1 https://github.com/raspberrypi/linux
复制代码
  上面的 git clone 命令下载的是当前活动分支,从这个分支构建 Raspberry Pi 操作体系镜像,没有任何汗青记载。省略 --depth=1可以下载整个版本库,包括所有分支的完备汗青。
要下载不带汗青记载的不同分支,在上述命令中添加 --branch 选项,并将 更换为要下载的分支名称
bashgit clone --depth=1 --branch <branch> https://github.com/raspberrypi/linux
  1.2 原生构建内核

1.2.1 安装编译依靠项

  1. sudo apt install bc bison flex libssl-dev make
复制代码
1.2.2 构建设置

在构建内核时应用默认设置。准备默认设置,需要根据 Raspberry Pi 型号运行相应命令,这里利用的是树莓派5,命令为:
  1. cd linux
  2. KERNEL=kernel_2712
  3. make bcm2712_defconfig
复制代码
1.2.3 利用 LOCALVERSION 自定义内核版本

为防止内核覆盖 /lib/modules 中的现有模块,并在 uname 输出中说明运行的是自己的内核,调整 LOCALVERSION。
修改 .config 中的以下一行:
  1. CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
复制代码
1.2.4 构建

构建内核。这一步大概需要很长时间, 取决于 Raspberry Pi 型号:
  1. # 构建 64 位内核
  2. make -j6 Image.gz modules dtbs
  3. # 构建 32 位内核
  4. make -j6 zImage modules dtbs
复制代码
1.2.5 安装内核

将内核模块安装到启动媒体上:
  1. sudo make -j6 modules_install
复制代码
然后,将内核和设备树 blobs 安装到启动分区中,并备份原始内核。
   假如不想在运行此命令的 Raspberry Pi 上安装刚编译好的内核,可将编译好的内核复制到另一个启动介质的启动分区,而不是 /boot/firmware/。
  

  • 安装 64 位内核:
  1. # 运行以下命令创建当前内核的备份镜像,安装新的内核镜像、覆盖层、README,并卸载分区
  2. sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
  3. sudo cp arch/arm64/boot/Image.gz /boot/firmware/$KERNEL.img
  4. sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware/$KERNEL-backup.img
  5. sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
  6. sudo cp arch/arm64/boot/dts/overlays/README /boot/firmware/overlays/
复制代码


  • 安装 32 位内核:
  1. # 创建当前内核的备份,然后安装新的内核映像
  2. sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
  3. sudo cp arch/arm/boot/zImage /boot/firmware/$KERNEL.img
  4. # 根据内核版本,运行以下命令
  5. # 对于版本 6.4 以下的内核:
  6. sudo cp arch/arm/boot/dts/*.dtb /boot/firmware/
  7. # 适用于 6.5 及以上版本的内核:
  8. sudo cp arch/arm/boot/dts/broadcom/*.dtb /boot/firmware/
  9. # 复制覆盖层和 README
  10. sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
  11. sudo cp arch/arm/boot/dts/overlays/README /boot/firmware/overlays/
复制代码


  • 运行以下命令重启 Raspberry Pi 并运行新编译的内核
  1. sudo reboot
复制代码
1.3 交叉编译内核

首先需要准备一台符合的 Linux 交叉编译主机,这里利用的是 ubuntu。
1.3.1 安装所需的依靠项和工具链

  1. sudo apt install bc bison flex libssl-dev make
  2. libc6-dev libncurses5-dev# 安装 64 位工具链以构建 64 位内核,请运行以下命令sudo apt install crossbuild-essential-arm64# 安装 32 位工具链以构建 32 位内核,请运行以下命令sudo apt install crossbuild-essential-armhf
复制代码
1.3.2 编译设置

在构建内核时应用默认设置。准备默认设置,需要根据 Raspberry Pi 型号运行相应命令,这里利用的是树莓派5,命令为:
  1. cd linux
  2. KERNEL=kernel_2712
  3. make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2712_defconfig
复制代码
1.3.3 利用 LOCALVERSION 自定义内核版本

为防止内核覆盖 /lib/modules 中的现有模块,并在 uname 输出中说明运行的是自己的内核,调整 LOCALVERSION。
修改 .config 中的以下一行:
  1. CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
复制代码
1.3.4 构建



  • 构建 64 位内核
  1. make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- 映像模块 dtbs
复制代码


  • 构建 32 位内核
  1. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage 模块 dtbs
复制代码
1.3.5 安装内核

构建内核后,需要将其复制到 Raspberry Pi 的启动媒体(大概是 SD 卡或 SSD)上并安装模块。


  • 查找启动媒体
    首先,运行 lsblk。然后,连接启动媒体。再次运行 lsblk;新设备代表启动媒体
    例如我这里的输出为:
  1. sdb
  2.    sdb1
  3.    sdb2
复制代码
将这些分区挂载为 mnt/boot 和 mnt/root,调整分区代号以匹配启动媒体的位置:
  1. mkdir mnt
  2. mkdir mnt/boot
  3. mkdir mnt/root
  4. sudo mount /dev/sdb1 mnt/boot
  5. sudo mount /dev/sdb2 mnt/root
复制代码


  • 安装
    将内核模块安装到启动媒体上:
  1. # 对于 64 位内核
  2. sudo env PATH=$PATH make -j12 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/root modules_install
  3. # 对于 32 位内核
  4. sudo env PATH=$PATH make -j12 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/root modules_install
复制代码


  • 将内核和设备树 blob 安装到启动分区,并备份原始内核
  1. # 安装 64 位内核
  2. sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
  3. sudo cp arch/arm64/boot/Image mnt/boot/$KERNEL.img
  4. sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/boot/
  5. sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/boot/overlays/
  6. sudo cp arch/arm64/boot/dts/overlays/README mnt/boot/overlays/
  7. sudo umount mnt/boot
  8. sudo umount mnt/root
  9. # 安装 32 位内核
  10. sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
  11. sudo cp arch/arm/boot/zImage mnt/boot/$KERNEL.img
  12. # 对于版本 6.4 以下的内核
  13. sudo cp arch/arm/boot/dts/*.dtb mnt/boot/
  14. #  6.5 及以上版本的内核
  15. sudo cp arch/arm/boot/dts/broadcom/*.dtb mnt/boot/
  16. sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/boot/overlays/
  17. sudo cp arch/arm/boot/dts/overlays/README mnt/boot/overlays/
  18. sudo umount mnt/boot
  19. sudo umount mnt/root
复制代码
末了,将启动媒体连接到 Raspberry Pi 并接通电源,运行新编译的内核。
2 设置内核

Linux 内核是高度可设置的, 以便根据自己的需要进行定制,例如启用新的或试验性的网络协议,或启用对新硬件的支持。最常见的设置方法是通过 make menuconfig 界面完成, 也可以手动修改你的 .config 文件:
2.1 准备设置

menuconfig 工具需要 ncurses 开发头文件才能正常编译:
  1. sudo apt install libncurses5-dev
复制代码
接下来,下载内核源代码。
2.2 menuconfig

编译并运行 menuconfig 工具:
  1. make menuconfig
  2. # 交叉编译 64 位内核:
  3. make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
  4. # 交叉编译 32 位内核:
  5. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
复制代码
简短编译后,menuconfig 将显示包罗所有可设置选项的子菜单列表。第一次实验时,不要轻易启用或禁用很多选项;这样很容易破坏设置。
3 内核补丁

在构建自定义内核时,大概希望在 Linux 内核中应用补丁或补丁集(patchsets)。
3.1 确定内核版本

查看设备上当前运行的内核版本:
  1. uname -r
  2. # 6.6.51+rpt-rpi-2712
复制代码
在打补丁之前,务必检查内核版本。在内核源代码目录下,运行以下命令查看内核版本:
  1. head Makefile -n n
  2. # 类似下面的输出:
  3. # SPDX-License-Identifier: GPL-2.0
  4. VERSION = 6
  5. PATCHLEVEL = 1
  6. SUBLEVEL = 38
  7. EXTRAVERSION =
  8. NAME = Pinguïn Aangedreven
复制代码
这里可以看到版本为 6.1.38。
3.2 应用补丁

补丁的应用取决于补丁的发布格式。开发者会以单个文件的形式发布大多数补丁。利用 patch 工具来打补丁。
以下命令将下载、解压缩并利用实时内核补丁:
  1. wget https://www.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.38-rt13-rc1.patch.gz
  2. gunzip patch-6.1.38-rt13-rc1.patch.gz
  3. cat patch-6.1.38-rt13-rc1.patch | patch -p1
复制代码
有些开发者会以 邮箱格式 发布补丁,即一个包罗多个补丁文件的文件夹。利用 Git 可以打上这些补丁:
  1. git am -3 /path/to/patches/*
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表