树莓派内核源码的下载,配置,编译和替换

news2025/5/24 15:30:20

共享文件夹的创建

ubuntu创建共享文件夹可以实现和本地windows跨系统文件共享

下面是创建步骤

先在windows准备一个文件夹来当做共享文件夹

树莓派内核源码下载

1.在树莓派终端输入以下指令查看内核版本

uname -r

我这里是已经编译替换过后的版本

2.选择树莓派对应的版本号下载并将下载好的内核源码复制到共享文件夹

下载仓库:https://github.com/raspberrypi/linux

注:如果打不开github仓库的可以试试以下方法

3.在ubuntu工作目录下创建SYSTEM文件夹并将内核源码复制到SYSTEM文件夹中解压

cp /mnt/hgfs/share/linux-rpi-6.1.y.zip ~/SYSTEM
cd SYSTEM
unzip linux-rpi-6.1.y.zip

安装tree(tree是查看源码目录的指令)

sudo apt-get install tree

树莓派Linux源码配置

驱动代码的编写

驱动代码的编译需要一个提前编译好的内核
编译内核就必须配置
配置的最终目标会生成.config文件,该文件指导Makefile去把有用东西组织成内核

第一种方式: 基于默认配置生成.config文件

32位:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2711_defconfig

64位:

ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel8 make bcm2711_defconfig 

ARCH=:指定架构
CROSS_COMPILE=:指定编译器
KERNEL=:指定内核版本
make:GNU 构建工具,用于执行内核配置。
bcm2711_defconfig:内核配置文件名称

第二种方式:进入配置菜单进行逐项配置(需提前安装ncurses库)

#要安装的库(这里配置和后面编译会用到)

sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
sudo apt-get install -y libssl-dev

32位:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig

64位:

ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel8 make menuconfig 

[*] :表示该功能将被编译进内核(built - in )。
[ ] :表示该功能被排除,不会被编译进内核 。
[M] :表示该功能将被编译成可加载模块(module ),后续可通过 insmod 等命令动态加载

 树莓派Linux内核编译

32位编译:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs

64位编译:

ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel8 make -j4 Image modules dtbs

ARCH=arm:指定为RAM架构
CROSS_COMPILE=arm-linux-gnueabihf- :指定编译器
KERNEL=kernel7:指定内核版本
-j4:四核处理器来编译(可根据虚拟机的硬件来更改)改成V=1(禁用并行,获取详细错误信息)
zImage:生成内核镜像
modules:生成的驱动模块
dtbs:配置文件等等

我用的32位编译用了大概一个多小时,编译好了之后可以查看源码树目录下会生成" vmlinux " (没有压缩的Linux)

真正的生成的Linux内核在源码树目录下 arch/arm/boot 下生成的 " zImage "

成功后打包zImage成树莓派可用的xxx.img

./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

如果提示没有mkknlimg脚本,就创建一个mkknlimg脚本

vi mkknlimg 

里面填充以下内容:

#!/bin/bash
# mkknlimg:将 zImage 处理为指定格式的内核镜像

# 检查参数是否正确(输入文件和输出文件)
if [ $# -ne 2 ]; then
    echo "Usage: $0 <input_zImage> <output_image>"
    exit 1
fi

input_file=$1
output_file=$2

# 检查输入文件是否存在
if [ ! -f "$input_file" ]; then
    echo "Error: Input file $input_file not found"
    exit 1
fi

# 简单处理:直接复制并添加头部(根据实际需求修改)
# 示例:对于树莓派,可能需要在头部添加特定字节(0x200 字节的填充)
dd if=/dev/zero of="$output_file" bs=1 count=200
cat "$input_file" >> "$output_file"

echo "Successfully created $output_file"

此时再打包就不会报错了

数据拷贝

1.将SD卡插入读卡器插入电脑连接虚拟机

2.查看是否接入虚拟机

dmesg

3.创建2个挂载U盘的文件夹

mkdir data1
mkdir data2


data1–>fat分区–>放置镜像文件
data2–>ext4分区–>放置根目录文件

4.挂载sdb1和sdb2 到 data1 data2

sudo mount /dev/sdb1  data1  
sudo mount /dev/sdb2  data2

此时data1和data2就有数据了(data1:(fat分区) 放置内核镜像 data2(ext4分区):存放存放根目录)

5.安装modules 设备驱动文件

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/cc/data2 modules_install

INSTALL_MOD_PATH:这里用的绝对路径避免出错

6.安装更新kernel.img文件,注意镜像名字是kernel7.img


先开启另一个命令终端,进入data1分区

cd /home/cc/data1


避免刷机失败我们把kernel7.img备份一下

cp kernel7.img kernel7old.img


在原来的命令终端(镜像文件夹)再把编译新生成的拷贝到data1,起名kernel7.img

cp kernel_new.img /home/cc/data1/kernel7.img


拷贝相关的配置文件

cp arch/arm/boot/dts/.*dtb* /home/cc/data1
cp arch/arm/boot/dts/overlays/.*dtb* /home/cc/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/cc/data1/overlays/

注意路径问题,这里是我的路径,要根据自己的路径来,不要出错

7.断开SD卡在ubuntu的连接,把SD卡的连接到window上

1.在window底下修改codline.txt文件
复制以下代码进行覆盖:

dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait


2.修改config.tex文件
在文件的末尾加上(如果有这句,就不需要加)

dtoverlay=pi3-miniuart-bt

8.把SD卡插回树莓派,开启串口启动树莓派

9.查看内核版本看看是否变动

uname -r

参考文章:树莓派-内核开发-说明 下载代码 编译 替换内核_树莓派-内核开发-说明 下载代码 编译 替换内核 nicekwell-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS停止维护了,解决yum不能安装软件的问题

最近在使用CentOS的yum命令安装软件时&#xff0c;出现了如下错误&#xff1a; 原因&#xff1a; 这是因为CentOS在2024 年 6 月 30 日停止维护了&#xff0c;同时也移除了相关的软件镜像仓库&#xff0c;导致网站地址访问不了&#xff0c;从而下载不了软件。 解决方法&#xf…

过压保护电路设计和计算

设备供电电压因各种原因变得过高会烧坏设备,因此可以在前级加过压保护电路。 稳压二极管+PMOS 电路分析 1、当输入电压 Vin < 5.1V 时:(下图以输入电压 Vin = 5V 举例) D1是5.1V稳压管,此时输入电压Vin才5V,小于5.1V,所以稳压管D1未进入稳压状态,不导通。 5.1V稳…

20250523-BUG:无法加载“GameLib/Framework.h“头文件(已解决)

BUG&#xff1a;无法加载"GameLib/Framework.h"头文件&#xff08;已解决&#xff09; 最近在打开新的C项目时报了这个错&#xff0c;我是按照以下步骤来排除的BUG&#xff0c;希望对您有所帮助~ 检查【C/C】-【附加包含目录】中的路径有无问题&#xff0c;一般需要加…

OpenCv高阶(8.0)——答题卡识别自动判分

文章目录 前言一、代码分析及流程讲解&#xff08;一&#xff09;初始化模块正确答案映射字典&#xff08;题目序号: 正确选项索引&#xff09;图像显示工具函数 &#xff08;二&#xff09;轮廓处理工具模块&#xff08;三&#xff09;几何变换核心模块 二、主处理流程图像读取…

Python语法特点与编码规范

注释 单行注释 把#号当做注释符号 多行注释 python中并没有规定多行注释标记&#xff0c;通常使用单引号作为多行注释 中文注释 规定文件所用编码&#xff0c;当时是为解决python2不支持中文的问题 #codingutf-8代码缩进 python采用代码缩进和冒号区分代码层次&#xff0c…

反本能---如何对抗你的习以为常

目录 一、概述 二、自我提升 &#xff08;一&#xff09;我们为什么总想拖延 &#xff08;二&#xff09;如何有效应对拖延 &#xff08;三&#xff09;如何更好的自我控制 &#xff08;四&#xff09;为啥付出了没有回报 &#xff08;五&#xff09;如何提高学习效率 三…

(15)关于窗体的右键菜单的学习与使用,这关系到了信号与事件 event

&#xff08;1&#xff09;起因来源于 4.11 的老师讲的例题&#xff0c;标准的&#xff0c;规范的使用右键菜单的代码及参考资料如下&#xff1a; &#xff08;2&#xff09; 接着脱离上面的那个复杂的环境&#xff0c;用简单的例子测试一下 &#xff1a; 说明老师讲的都是对…

Ubuntu Desktop 24.04 常用软件安装步骤

文章目录 Ubuntu Desktop 24.04 常用软件安装步骤Snipaste F1快捷截图&#xff08;超方便 | 我6台电脑每台都用&#xff09;搜狗输入法快速浏览工具 | 空格键快速预览文件壁纸工具 | varietySSH 工具 | Termius 终端分屏工具 | TmuxCaffeine | 避免息屏小工具 一些设置将启动台…

Linux iSCSI存储共享实验指南

实验介绍 1、在Linux平台上通过iSCSI协议实现IP-SAN存储共享 2、掌握存储导出(export)和存储导入(import)的配置方法 3、学习iSCSI存储的发现、连接、断开和管理操作 1、实验环境 两台同网段的Linux虚拟机&#xff08;无需物理交换机&#xff09; 操作系统&#xff1a;Lin…

git入门之HEAD介绍

目录 前言一、HEAD 的含义与作用二、游离状态的触发场景及特征1. 触发条件2. 游离状态的特征 三、游离状态的常见使用情况1. 临时查看历史代码2. 保留游离状态的提交 四、注意事项与最佳实践1. 风险防范2. 状态检测技巧 总结 前言 本文介绍Git核心概念HEAD的定义&#xff0c;作…

车道线检测:自动驾驶的“眼睛”

在自动驾驶技术的庞大体系中&#xff0c;车道线检测扮演着至关重要的角色&#xff0c;它就像是自动驾驶汽车的“眼睛”&#xff0c;帮助车辆感知道路边界&#xff0c;从而实现安全、准确的行驶。今天&#xff0c;我们就来深入探讨一下车道线检测的奥秘&#xff0c;看看它是如何…

力扣面试150题--填充每个节点的下一个右侧节点指针 II

Day 45 题目描述 思路 初次做法&#xff1a;考虑到每一节点都要指向它右边的第一个节点&#xff0c;那么我们需要从根向下&#xff0c;最好每次提前处理根节点指向它右边的节点&#xff0c;那么符合这样的遍历方法&#xff0c;很容易i想到前序遍历&#xff0c;但是前序遍历是…

使用openvino和onnxruntime的SDK部署yolo11检测模型

这里的代码参考ultralytics代码库里面的examples文件夹下面的openvino和onnxruntime使用案例部署yolo11检测模型的代码。这两种部署框架和前面的tensorRT框架都是类似的&#xff0c;只是使用的接口不太一样。 PART A -- onnxruntime的使用 1.下载onnxruntime的推理框架 (1) …

C 语言学习笔记(指针4)

内容提要 指针 函数指针与指针函数二级指针 指针 函数指针与指针函数 函数指针 定义 函数指针本质上是指针&#xff0c;是一个指向函数的指针。函数都有一个入口地址&#xff0c;所谓指向函数的指针&#xff0c;就是指向函数的入口地址。&#xff08;这里的函数名就代表…

MySQL的相关操作

目录 一. 字符串函数 二. group by分组 2.1 作用 2.2 格式 2.3 举例 三. order by排序 3.1 格式 3.2 举例 四. limit 4.1 作用 4.2 举例 五. having 5.1 作用 5.2 举例 六. 正则表达式 七. 多表查询 7.1 定义 7.2 子查询 7.3 联合查询 纵向合并 7.4 交叉连…

鸿蒙HarmonyOS多设备流转:分布式的智能协同技术介绍

随着物联网和智能设备的普及&#xff0c;多设备间的无缝协作变得越来越重要。鸿蒙&#xff08;HarmonyOS&#xff09;作为华为推出的新一代操作系统&#xff0c;其分布式技术为实现多设备流转提供了强大的支持。本文将详细介绍鸿蒙多设备流转的技术原理、实现方式和应用场景。 …

XXE(外部实体注入)

目录 学习xxe前提&#xff1a;了解xml格式 1. XML基础 2. XXE基础知识 2.1. 结构 2.2. 定义与原理 2.3. XML实体类型 2.4. 攻击类型 2.5. 防御措施 3. pikachu靶场xxe练习 学习xxe前提&#xff1a;了解xml格式 1. XML基础 文档结构包括XML声明、DTD文档类型定义&…

jenkins凭据管理

用途: 存储构建需要与其他系统认证所使用的账户或者密码信息. Username with password类型存储Harbor或者其他系统的用户名和密码。GitLab API token类型存储Gitlab的用户API token。Secret text类型可以用来存储OpenShift等系统中的token。Certificate类型可以用户存储证书&am…

驱动开发硬核特训 · Day 31:理解 I2C 子系统的驱动模型与实例剖析

&#x1f4da; 训练目标&#xff1a; 从驱动模型出发&#xff0c;掌握 I2C 子系统的核心结构&#xff1b;分析控制器与从设备的注册流程&#xff1b;结合 AT24 EEPROM 驱动源码与设备树实例&#xff0c;理解 i2c_client 与 i2c_driver 的交互&#xff1b;配套高质量练习题巩固理…

【python】局域网内通过python远程重启另一台windows电脑

&#x1f449;技__能&#x1f448;&#xff1a;C/C/C#/Python/Java/PHP/Vue/Node.js/HTML语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 局域网内通过python远程重启另一台windows电脑 目录 局域网内通过python远程…