树莓派linux内核源码编译

Raspberry Pi 内核 托管在 GitHub 上;更新滞后于上游 Linux内核,Raspberry Pi 会将 Linux 内核的长期版本整合到 Raspberry Pi 内核中。

1 构建内核

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

1.1 下载内核源代码

下载最新 Raspberry Pi 内核的源代码:

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 安装编译依赖项
sudo apt install bc bison flex libssl-dev make
1.2.2 构建配置

在构建内核时应用默认配置。准备默认配置,需要根据 Raspberry Pi 型号运行相应命令,这里使用的是树莓派5,命令为:

cd linux
KERNEL=kernel_2712
make bcm2712_defconfig
1.2.3 使用 LOCALVERSION 自定义内核版本

为防止内核覆盖 /lib/modules 中的现有模块,并在 uname 输出中说明运行的是自己的内核,调整 LOCALVERSION

修改 .config 中的以下一行:

CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
1.2.4 构建

构建内核。这一步可能需要很长时间, 取决于 Raspberry Pi 型号:

# 构建 64 位内核
make -j6 Image.gz modules dtbs

# 构建 32 位内核
make -j6 zImage modules dtbs
1.2.5 安装内核

将内核模块安装到启动媒体上:

sudo make -j6 modules_install

然后,将内核和设备树 blobs 安装到启动分区中,并备份原始内核。

如果不想在运行此命令的 Raspberry Pi 上安装刚编译好的内核,可将编译好的内核复制到另一个启动介质的启动分区,而不是 /boot/firmware/。

  • 安装 64 位内核:
# 运行以下命令创建当前内核的备份镜像,安装新的内核镜像、覆盖层、README,并卸载分区
sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image.gz /boot/firmware/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware/$KERNEL-backup.img
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/firmware/overlays/
  • 安装 32 位内核:
# 创建当前内核的备份,然后安装新的内核映像
sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage /boot/firmware/$KERNEL.img

# 根据内核版本,运行以下命令
# 对于版本 6.4 以下的内核:
sudo cp arch/arm/boot/dts/*.dtb /boot/firmware/
# 适用于 6.5 及以上版本的内核:
sudo cp arch/arm/boot/dts/broadcom/*.dtb /boot/firmware/

# 复制覆盖层和 README
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/firmware/overlays/
  • 运行以下命令重启 Raspberry Pi 并运行新编译的内核
sudo reboot
1.3 交叉编译内核

首先需要准备一台合适的 Linux 交叉编译主机,这里使用的是 ubuntu。

1.3.1 安装所需的依赖项和工具链
sudo apt install bc bison flex libssl-dev make 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,命令为:

cd linux
KERNEL=kernel_2712
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2712_defconfig
1.3.3 使用 LOCALVERSION 自定义内核版本

为防止内核覆盖 /lib/modules 中的现有模块,并在 uname 输出中说明运行的是自己的内核,调整 LOCALVERSION

修改 .config 中的以下一行:

CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
1.3.4 构建
  • 构建 64 位内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- 映像模块 dtbs
  • 构建 32 位内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage 模块 dtbs
1.3.5 安装内核

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

  • 查找启动媒体
    首先,运行 lsblk。然后,连接启动媒体。再次运行 lsblk;新设备代表启动媒体
    例如我这里的输出为:
sdb
   sdb1
   sdb2

将这些分区挂载为 mnt/boot 和 mnt/root,调整分区代号以匹配启动媒体的位置:

mkdir mnt
mkdir mnt/boot
mkdir mnt/root
sudo mount /dev/sdb1 mnt/boot
sudo mount /dev/sdb2 mnt/root
  • 安装
    将内核模块安装到启动媒体上:
# 对于 64 位内核
sudo env PATH=$PATH make -j12 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/root modules_install

# 对于 32 位内核
sudo env PATH=$PATH make -j12 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/root modules_install
  • 将内核和设备树 blob 安装到启动分区,并备份原始内核
# 安装 64 位内核
sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image mnt/boot/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README mnt/boot/overlays/
sudo umount mnt/boot
sudo umount mnt/root



# 安装 32 位内核
sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage mnt/boot/$KERNEL.img
# 对于版本 6.4 以下的内核
sudo cp arch/arm/boot/dts/*.dtb mnt/boot/
#  6.5 及以上版本的内核
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

最后,将启动媒体连接到 Raspberry Pi 并接通电源,运行新编译的内核。

2 配置内核

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

2.1 准备配置

menuconfig 工具需要 ncurses 开发头文件才能正常编译:

sudo apt install libncurses5-dev

接下来,下载内核源代码。

2.2 menuconfig

编译并运行 menuconfig 工具:

make menuconfig

# 交叉编译 64 位内核:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
# 交叉编译 32 位内核:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

简短编译后,menuconfig 将显示包含所有可配置选项的子菜单列表。第一次尝试时,不要轻易启用或禁用很多选项;这样很容易破坏配置。

3 内核补丁

在构建自定义内核时,可能希望在 Linux 内核中应用补丁或补丁集(patchsets)。

3.1 确定内核版本

查看设备上当前运行的内核版本:

uname -r
# 6.6.51+rpt-rpi-2712

在打补丁之前,务必检查内核版本。在内核源代码目录下,运行以下命令查看内核版本:

head Makefile -n n

# 类似下面的输出:
# SPDX-License-Identifier: GPL-2.0
VERSION = 6
PATCHLEVEL = 1
SUBLEVEL = 38
EXTRAVERSION =
NAME = Pinguïn Aangedreven

这里可以看到版本为 6.1.38。

3.2 应用补丁

补丁的应用取决于补丁的发布格式。开发者会以单个文件的形式发布大多数补丁。使用 patch 工具来打补丁。

以下命令将下载、解压缩并使用实时内核补丁:

wget https://www.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.38-rt13-rc1.patch.gz
gunzip patch-6.1.38-rt13-rc1.patch.gz
cat patch-6.1.38-rt13-rc1.patch | patch -p1

有些开发者会以 邮箱格式 发布补丁,即一个包含多个补丁文件的文件夹。使用 Git 可以打上这些补丁:

git am -3 /path/to/patches/*

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949770.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

graylog+sidecar通过docker-compose部署并采集SSH登录日志

文章目录 前言一、graylog日志系统数据流向清洗图二、资源准备及部署1.docker-compose部署2.准备docker-compose.yml文件3.安装graylog-sidecar并配置4.给sidecar创建token 三、graylog-WEB配置采集SSH日志1.配置Inputs2.创建sidecar采集器3.将页面创建好的sidecar与服务器绑定…

【Vue.js】监听器功能(EventListener)的实际应用【合集】

目录 &#x1f914;在实际开发过程中&#xff0c;我遇到了一个颇为棘手的小问题 &#x1f60b;解决这个小问题 问题出现的原因剖析 解决方法阐述 问题成功解决&#xff01;​ &#x1f4d6;相关知识总结 基本概念 使用方法 实际应用场景 &#x1f914;在实际开发过程中…

2023年区块链职业技能大赛——区块链应用技术(一)模块一

模块一:区块链产品方案设计及系统运维: 任务1-1:区块链产品需求分析与方案设计 1.依据给定区块链食品溯源系统的业务架构图&#xff0c;对考题进行业务分析&#xff0c;可能多的去考虑一个业务系统所需要的模块&#xff0c;使用Visio或思维导图工具展现本系统的基本设计概念和…

【HarmonyOS应用开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 一、在media文件夹中添加想要使用的图片素材​ 二、在entry/src/main/ets/page目录下创建Welcome.ets文件 1. 整体结构与组件声…

Flutter Android修改应用名称、应用图片、应用启动画面

修改应用名称 打开Android Studio&#xff0c;打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件&#xff0c;将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包&#xff0c;应用的名称…

MES管理系统如何解决企业制造瓶颈

在当今全球化与信息化高度融合的时代&#xff0c;制造业作为支撑国家经济发展的关键产业&#xff0c;正处于发展的十字路口&#xff0c;面临着一系列严峻挑战。从日常所需的各类用品到先进的高端工业产品&#xff0c;制造业的稳定发展对经济的稳健运行至关重要&#xff0c;一旦…

Maven 详细配置:Maven settings 配置文件的详细说明

Maven settings 配置文件是 Maven 环境的重要组成部分&#xff0c;它用于定义用户特定的配置信息和全局设置&#xff0c;例如本地仓库路径、远程仓库镜像、代理服务器以及认证信息等。settings 文件分为全局配置文件&#xff08;settings.xml&#xff09;和用户配置文件&#x…

【C++】18.继承

文章目录 1.继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化 1.3 继承类模板 2.基类和派生类对象赋值转换3.继承中的作用域3.1 隐藏规则&#xff1a;3.2 考察继承作用域相关选择题 4.派生类的默认成员函数4…

声音是如何产生的

一、音频概述 RTMP中一般音频采用aac编码&#xff0c;采样率为44100HZ, 每帧1024采样&#xff0c;帧率43&#xff0c;23.2ms一帧 RTC中一般音频采用opus编码&#xff0c;采样率为48000HZ&#xff0c;每帧480采样&#xff0c;帧率100&#xff0c;10ms一帧 通道数&#xff08;c…

什么是中间件中间件有哪些

什么是中间件&#xff1f; 中间件&#xff08;Middleware&#xff09;是指在客户端和服务器之间的一层软件组件&#xff0c;用于处理请求和响应的过程。 中间件是指介于两个不同系统之间的软件组件&#xff0c;它可以在两个系统之间传递、处理、转换数据&#xff0c;以达到协…

问题清除指南|关于num_classes与 BCELoss、BCEWithLogitsLoss 和 CrossEntropyLoss 的关系

前言&#xff1a;关于「 num_classes 1 」引发的探究。 2024年尾声&#xff0c;学弟问到一个问题&#xff1a;在研究工作 CNNDetection 的github开源代码 networks/trainer.py 文件的 line 27 self.model resnet50(num_classes1) 中&#xff0c;变量 num_classes 的值为1&…

FinDKG: 用于检测金融市场全球趋势的动态知识图谱与大型语言模型

“FinDKG: Dynamic Knowledge Graphs with Large Language Models for Detecting Global Trends in Financial Markets” 论文地址&#xff1a;https://arxiv.org/pdf/2407.10909 摘要 动态知识图&#xff08;DKG&#xff09;能够表示对象间随时间变化的关系&#xff0c;适用于…

Robot---奇思妙想轮足机器人

1 背景 传统机器人有足式、轮式、履带式三种移动方式&#xff0c;每种移动方式都有各自的优缺点。轮式机器人依靠车轮在地面上移动&#xff0c;能源利用率高、移动速度快&#xff0c;但是仅以轮子与地面接触&#xff0c;缺乏越障能力和对复杂地形的适应能力&#xff0c;尤其面对…

高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图

目录 高效工作流&#xff1a;用Mermaid绘制你的专属流程图 一、流程图的使用场景 1.1、流程图flowChart 1.2、使用场景 二、如何使用mermaid画出优雅的流程图 2.1、流程图添加图名 2.2、定义图类型与方向 2.3、节点形状定义 2.3.1、规定语法 2.3.2、不同节点案例 2.…

.NET框架用C#实现PDF转HTML

HTML作为一种开放标准的网页标记语言&#xff0c;具有跨平台、易于浏览和搜索引擎友好的特性&#xff0c;使得内容能够在多种设备上轻松访问并优化了在线分享与互动。通过将PDF文件转换为HTML格式&#xff0c;我们可以更方便地在浏览器中展示PDF文档内容&#xff0c;同时也更容…

Tableau数据可视化与仪表盘搭建-可视化原则及BI仪表盘搭建

目录 可视化原则 BI仪表盘搭建 仪表盘搭建原则 明确仪表盘主题 仪表盘主题拆解 开发设计工作表 经营情况总览&#xff1a;突出显示的文字 经营数据详情&#xff1a;表格 每日营收数据&#xff1a;多轴折线图 每日流量数据&#xff1a;双轴组合图 新老客占比&#xf…

AIA - APLIC之三(附APLIC处理流程图)

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 APLIC复位 APLIC复位后,其所有状态都变得有效且一致,但以下情况除外: 每个中断域的domaincfg寄存器(spec第 4.5.1 节);可能是machine-level interrupt domain的MSI地址配置寄存器(spec第4.5.3 和4.5…

unity学习5:创建一个自己的3D项目

目录 1 在unity里创建1个3D项目 1.1 关于选择universal 3d&#xff0c;built-in render pipeline的区别 1.2 创建1个universal 3d项目 2 打开3D项目 2.1 准备操作面板&#xff1a;操作界面 layout,可以随意更换 2.2 先收集资源&#xff1a;打开 window的 AssetStore 下载…

AI赋能跨境电商:魔珐科技3D数字人破解出海痛点

跨境出海进入狂飙时代&#xff0c;AI应用正在深度渗透并重塑着跨境电商产业链的每一个环节&#xff0c;迎来了发展的高光时刻。生成式AI时代的大幕拉开&#xff0c;AI工具快速迭代&#xff0c;为跨境电商行业的突破与飞跃带来了无限可能性。 由于跨境电商业务自身特性鲜明&…

我用Ai学Android Jetpack Compose之Text

这篇开始学习各种UI元素&#xff0c;答案来自 通义千问&#xff0c;通义千问没法生成图片&#xff0c;图片是我补充的。 下述代码只要复制到第一个工程&#xff0c;做一些import操作&#xff0c;一般import androidx.compose包里的东西&#xff0c;即可看到预览效果。完整工程代…