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

共享文件夹的创建

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博客

相关推荐
-SGlow-3 天前
Linux相关概念和易错知识点(51)(mmap文件映射、共享内存原理、malloc的原理)
linux·c语言·算法·内核
mounter6258 天前
深度解析 Linux 内核 devlink:从硬件控制到跨功能速率调度的演进
linux·运维·服务器·网络·内核
零K沁雪10 天前
Linux 内核中网络地址快速打印符
linux·内核
零K沁雪10 天前
Linux 内核中与网络地址相关的函数
linux·内核
零K沁雪10 天前
Linux 内核遍历宏介绍
linux·内核
MIXLLRED11 天前
树莓派4B(Ubuntu 22.04 Jammy arm64)上从源码编译安装 librealsense
ubuntu·树莓派·librealsense
零K沁雪12 天前
内核定时器
linux·内核
mounter62513 天前
【LSF/MM内核前沿】Linux 内存回收推倒重来?解析 MGLRU 与传统 LRU 的“统一之战”
linux·运维·服务器·网络·内核·内存回收
weixin_4266892016 天前
VSCODE 树莓派C语言开发环境建立
vscode·树莓派
Qt程序员16 天前
深入理解 Linux 内核 RCU 机制:从原理到实现
linux·c++·内核·linux内核·rcu