Linux内核开发-编译内核源码

前言

大部分公司的所谓的Linux内核工程师主要工作是基于社区开源内核进行定制化修改,基本不会有机会向上游提供patch,仅限于公司内部业务的修修补补。

作为内核开发工程师两年多,精力一直被公司业务消耗,所有的内核知识都来自于公司业务驱动学习,一切编译都在SDK环境下进行,从未自己进行社区版本的内核进行编译。

本专题主要记录自己的学习过程。

内核编译

0.查看内核版本

我本地的开发环境是全新安装的Ubuntu18.04,本次学习目标是替换内核版本。先查看当前的内核版本:

cat /proc/version
结果:Linux 5.3.0-28-generic

1.下载内核源码

链接: kernel官网
选一个和当前机器不同版本的内核下载进行编译、替换测试

2.解压

tar -xvf linux-5.10.219.tar.xz

3.编译

# 切换到源码目录
cd linux-5.10.219/# 编译准备:机器刚装上系统还没有编译器
sudo apt install gcc# 内核编译配置,生成.config文件,后续可以直接修改.config文件跳过此步骤直接进行编译
make menuconfg# 编译,-j代表并行编译;开并行能显著提速,但是出错时得往前翻编译log(社区稳定版本一般不会有代码编译错误)
make -j$(nproc)# 初次编译一般会报错,都是缺少一些依赖库导致的,复制报错信息查一下即可,以下是我遇到的报错以及解决方式
# 报错:Unable to find the ncurses package. recipe for target ‘scripts/kconfig/.mconf-cfg‘ failed
#sudo apt-get install libncurses5-dev# 报错:fatal error: openssl/opensslv.h: No such file or directory
# sudo apt-get install libssl-dev# 至此已经编译完成了,但是为了后续替换内核版本,继续执行如下指令# 编译好的模块拷贝到系统目录下(默认是/lib/modules/)
make modules_install
# 安装
make install

4.查看编译结果

源码目录下已经生成了内核Image文件:
在这里插入图片描述
各个模块的目录,可以看到已经生成了*.o文件:

myname@myname-VirtualBox:~/file/linux-5.10.219/net/bridge$ ll
总用量 3596
drwxr-xr-x  3 myname myname   4096 619 22:15 ./
drwxr-xr-x 72 myname myname   4096 619 21:43 ../
-rw-r--r--  1 myname myname  11685 616 19:32 br_arp_nd_proxy.c
-rw-rw-r--  1 myname myname  10400 619 21:41 br_arp_nd_proxy.o
-rw-rw-r--  1 myname myname  61147 619 21:41 .br_arp_nd_proxy.o.cmd
-rw-r--r--  1 myname myname   8994 616 19:32 br.c
-rw-r--r--  1 myname myname  11891 616 19:32 br_device.c
-rw-rw-r--  1 myname myname  17192 619 21:40 br_device.o
......

切换到/lib/modules/下,随便进一个模块,可以看到ko产物已经拷贝到此目录下了

myname@myname-VirtualBox:/lib/modules/5.10.219/kernel/net/bridge$ ll
总用量 392
drwxr-xr-x  3 root root   4096 618 20:50 ./
drwxr-xr-x 58 root root   4096 618 20:50 ../
-rw-r--r--  1 root root 355001 618 20:50 bridge.ko
-rw-r--r--  1 root root  31489 618 20:50 br_netfilter.ko
drwxr-xr-x  2 root root   4096 618 20:50 netfilter/
#清理编译产物
make clean

下一章:替换内核版本

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

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

相关文章

异构集成封装类型2D、2.1D、2.3D、2.5D和3D封装技术

异构集成封装类型:2D、2.1D、2.3D、2.5D和3D封装详解 简介随着摩尔定律的放缓,半导体行业越来越多地采用芯片设计和异构集成封装来继续推动性能的提高。这种方法是将大型硅芯片分割成多个较小的芯片,分别进行设计、制造和优化,然后…

【深度学习驱动流体力学】计算流体力学openfoam-paraview与python3交互

目的1:配置 ParaView 中的 Python Shell 和 Python 交互环境 ParaView 提供了强大的 Python 接口,允许用户通过 Python 脚本来控制和操作其可视化功能。在 ParaView 中,可以通过 View > Python Shell 菜单打开 Python Shell 窗口,用于执行 Python 代码。要确保正确配置 …

[Linux] vi编辑器

命令模式&文本模式 命令模式就输入命令然后执行,文本模式就是系统把你的输入都当成写进文件里的字符 切换模式: 刚进入默认是命令模式,按: i I a A o O 进入文本模式, 通过他们进入文本模式有什么不同? 然后按esc进…

python 版本切换,更换当前默认版本

电脑可以安装多个版本,但是好像没有正规的维护python版本的工具,比如前端就有nvm切换node版本,但是python我没找到比较好的(有大佬知道路过方便留言一下,跪谢。。) 废话不多说,更改默认版本很简…

DIVE INTO DEEP LEARNING 36-49

文章目录 36. Data augmentation36.1 Training with enhanced data36.2 Enhancement measures36.3 Data augmentation summary 37. Fine tuning37.1 Fine tuning Introduce37.2 Fine tuning Step37.3 Fine tuning summary 38. Object detection38.1 Object detection38.2 Edge …

[Linux] Shell

chsh不是一种sh,而是一个命令行使用程序,用于更改默认shell CentOS是个开源软件,没有sh,sh是商业版的, 按ls /bin/*sh显示的sh实际上是个链接文件,连接的bash 在命令行输入新的sh名,会启动一个新的进程, 输…

厂里资讯之app端文章搜索

app端文章搜索 1) 内容介绍 文章搜索 ElasticSearch环境搭建 索引库创建 文章搜索多条件复合查询 索引数据同步 搜索历史记录 Mongodb环境搭建 异步保存搜索历史 查看搜索历史列表 删除搜索历史 联想词查询 联想词的来源 联想词功能实现 2) 搭建ElasticSearch环境 …

MyBatis系列七: 一级缓存,二级缓存,EnCache缓存

缓存-提高检索效率的利器 官方文档 一级缓存基本介绍快速入门Debug一级缓存执行流程一级缓存失效分析 二级缓存基本介绍快速入门Debug二级缓存执行流程注意事项和使用细节 mybatis的一级缓存和二级缓存执行顺序小实验细节说明 EnCache缓存基本介绍配置和使用EhCache细节说明 My…

SpringBoot整合Minio(支持公有及私有bucket)

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: SpringBoot整合Minio(支持公有及私有bucket) ⏱️ 创作时间&#xff1…

张大哥笔记:如何选择一个人就值得做的副业

很多人喜欢把上班称为主业,把上班之外的工作称为副业,不管以哪种方式称呼都可以,只要能赚钱就行,上班的本质就是出卖时间,不管你是月入5000还是月入2万,都是给老板打工! 但搞笑的就是月入2万的人…

关于app爬虫的环境准备

摘要 有些数据需要在手机应用中才能查看,没有网页版,所以学习移动端的爬虫是有必要的。 手机系统分为安卓和苹果两大系统,本次讲解主要以安卓手机为例 有安卓手机的可以使用手机,没有的可以使用模拟器,本次以夜神模…

基于C++、MFC和Windows套接字实现的简单聊天室程序开发

一、一个简单的聊天室程序 该程序由服务器端和客户端两个项目组成,这两个项目均基于对话框的程序。服务器端项目负责管理客户端的上线、离线状态,以及转发客户端发送的信息。客户端项目则负责向服务器发送信息,并接收来自服务器的信息&#…

[机器学习算法]决策树

1. 理解决策树的基本概念 决策树是一种监督学习算法,可以用于分类和回归任务。决策树通过一系列规则将数据划分为不同的类别或值。树的每个节点表示一个特征,节点之间的分支表示特征的可能取值,叶节点表示分类或回归结果。 2. 决策树的构建…

《STM32 HAL库》小米微电机控制例程——通信协议分析及驱动库

之前有段时间因为机器狗项目的缘故,一直在使用小米微电机,但是苦于没有一个详尽的奶妈级教程,在控制电机的学习中踩了不少的坑。今天咱们就从头至尾一步一步的实现使用按键控制小米微电机。本文将会分析小米电机驱动库,并简要介绍…

练手代码之使用Python实现合并PDF文件

如果你有合并PDF的需要,你会怎么办 我们无所不能的程序员会选择写一个Python代码来实现(谁会这么无聊?是我),如果真的有PDF操作需要,我推荐你使用PDF Expert这个软件哈~ 话不多说直接上代码: …

Linux操作系统学习:day05

内容来自:Linux介绍 视频推荐:[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( 目录 day0530、删除用户31、添加和删除用户组创建用户组删除用户组 32、修改密码33、使用tar工具进行压缩和解压缩压缩解压缩 34、使用zip u…

增强大型语言模型(LLM)可访问性:深入探究在单块AMD GPU上通过QLoRA微调Llama 2的过程

Enhancing LLM Accessibility: A Deep Dive into QLoRA Through Fine-tuning Llama 2 on a single AMD GPU — ROCm Blogs 基于之前的博客《使用LoRA微调Llama 2》的内容,我们深入研究了一种称为量化低秩调整(QLoRA)的参数高效微调&#xff0…

单片机第五季-第八课:STM32CubeMx和FreeRTOS

1,FreeRTOS背景介绍 RTOS简介: 实时操作系统,本用于追求实时性的嵌入式系统,典型:ucos/uclinux/vxworks; 特点:中断响应快、一般可嵌套中断、使用实地址、多任务; (实…

Qt6视频播放器项目框架代码

视频播放的关键代码如下: 使用Qt6的QMediaPlayer,QVideoWidget实现 void FunnyWidget::initVideo() {player = new QMediaPlayer(this);videoWidget = new QVideoWidget(this);playButton = new QPushButton("Play", this);pauseButton = new QPushButton("…

项目的打包

一:打包到微信小程序 1)vscode打包 2)在微信小程序开发工具中打开路径,上传. 疑问:为什么pnpm bulid:mp-weixin用于打包,pnpm dev:mp-weixin也可生成对应路径下的文件?? 打包的是没有热重载,且打包体积更小. 二:条件编译 vscode可以打包成能在不同平台上运行的代码.但是有…