当前位置: 首页 > news >正文

嵌入式Linux学习-编译内核源码

嵌入式Linux学习-编译内核源码

1.给虚拟机添加新硬盘
2.打开虚拟机,创建分区,一开始输入了fdisk之后一直输入n,最后w保存

sudo fdisk /dev/sdb

3.把分区写进硬盘

sudo partprobe /dev/sdb
sudo partprobe /dev/sdb

4.格式化分区并挂载

mkfs.ext4 /dev/sdb1 #格式化
mkdir /sdb #创建挂载点
mount /dev/sdb1 /sdb #挂载
#设置自动挂载
vi /etc/fstab
# 添加如下信息:
/dev/sdb1   /sdb     ext4   defaults  0  0

5.下载内核源码并上传
用uname -r命令,可以看到示例输出如下:
5.15.0-76-generic,其格式通常为版本.次版本.修订版本-发行版后缀(如 5.15.0-76-generic)
下载主次版本一致的内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.tar.xz
如果虚拟机网速较慢,可以将上述链接复制到自己电脑的浏览器上下载。
然后上传到刚刚创建的分区、解压。

6.内核环境配置

make mrproper #内核源码在编译之前需要对源代码树进行清理,第一编译使用make mrproper 命令进行清理
sudo apt install libncurses-dev
#复制本机的内核配置文件到新内核目录
cp /boot/config-5.15.0-134-generic .config
#执行
make menuconfig 

在这里插入图片描述
在这里可以选择禁止自己不需要的模块,也可以使能需要的模块,比方说无线网卡驱动,或者选择使用ext3还是ext4文件系统。ext3(Third Extended Filesystem)
在这里插入图片描述
在这里选择M还是*的区别如下:

特性*(Built-in)M(Module)
编译位置直接嵌入内核镜像生成独立的 .ko 模块文件
加载方式开机时自动加载手动加载或按需自动加载
内核体积影响增加内核大小保持内核精简
适用场景关键功能(如文件系统、核心驱动)非必需功能(如外设驱动、调试工具)
运行时灵活性不可卸载可动态加载/卸载
在该界面可以进行内核裁剪,在满足功能需求的前提下,让内核尽可能轻量化。如果不确定某个选项的作用,可通过 查看描述,或暂时设为模块(M)观察影响。

我这里给它打上补丁
从以下网址下载对应版本的实时补丁
https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.15/older/

cd /path/to/linux-5.15
sudo bash -c 'for patch in patches/000*.patch; do patch -p1 < "$patch"; done'

在这个地方有冲突
在这里插入图片描述
cat查看一下,然后修改下图所示689行的代码
在这里插入图片描述
需要按照提示将.net/sched/sch_ets.c的相应代码改掉。

7.编译

sudo make -j4

可能会报错如下

/sdb/linux-5.15/tools/objtool/include/objtool/elf.h:10:10: fatal error: gelf.h: No such file or directory10 | #include <gelf.h>

执行以下代码即可

sudo apt install libelf-dev
#编译
sudo make modules_install
sudo make install

编译完成,可以reboot进入自己编译的系统了
在这里插入图片描述

在这里插入图片描述
问题记录:
reboot完没有看到自己编译的系统,可能需要确保GRUB包含自定义的内核。
GRUB是什么?
GRUB 是一个用于加载和管理系统启动的完整程序。它是 Linux 发行版中最常见的引导程序(bootloader)。

sudo update-grub

输出如下
在这里插入图片描述

总结流程大致为:下载内核源码->配置内核(打补丁?)->编译->安装内核模块->安装->更新bootloader

启动,长按shift,找到自己编译的系统
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/331023.html

相关文章:

  • vscode的ws环境,esp32s3连接wifi
  • 深入解析Python身份切换:安全权限管理实践指南
  • MyBatis缓存模块深度解析
  • dolphinscheduler中任务输出变量的问题出现ArrayIndexOutOfBoundsException
  • MCP和Agent之间的区别和联系
  • vercel部署上线
  • lesson38:MySQL数据库核心操作详解:从基础查询到高级应用
  • 飞算JavaAI智慧零售场景实践:从用户洞察到供应链优化的全链路技术升级
  • UniApp 中使用 tui-xecharts插件(或类似图表库如 uCharts)
  • [ HTML 前端 ] 语法介绍和HBuilderX安装
  • 通过网页调用身份证阅读器http websocket方法-湖南步联科技美萍MP999A电子————仙盟创梦IDE
  • 15 ABP Framework 开发工具
  • Transformer网络结构解析
  • HTML <link rel=“preload“>:提前加载关键资源的性能优化利器
  • CNN - 卷积层
  • MicroVM-as-a-Service 后端服务架构设计与实现
  • 使用 Docker 部署 PostgreSQL
  • 加密货币交易所开发:如何打造安全、高并发的数字资产交易平台?
  • 基于ECharts和EdgeOne打造云上智能图表
  • 单体架构集训整理
  • css 属性@font-face介绍
  • 经典深度学习模型——LSTM【原理解释 代码(以2025年美赛C题为例)】
  • FreeRTOS-C语言指针笔记
  • 【入门级-C++程序设计:13、STL 模板:栈(stack)、队 列(queue)、 链 表(list)、 向 量(vector) 等容器】
  • gitlab的ci/cd变量如何批量添加
  • 【P81 10-7】OpenCV Python【实战项目】——车辆识别、车流统计(图像/视频加载、图像运算与处理、形态学、轮廓查找、车辆统计及显示)
  • 智能清扫新纪元:有鹿机器人如何用AI点亮我们的城市角落
  • Streamlit实现Qwen对话机器人
  • CVPR 2025 | 机器人操控 | RoboGround:用“掩码”中介表示,让机器人跨场景泛化更聪明
  • GaussDB数据库架构师修炼(十六) 如何选择磁盘