如何向Linux内核提交开源补丁?
2021年,我曾经在openEuler社区上看到一项改进Linux内核工具的需求,因此参与过Linux内核社区的开源贡献。贡献开源社区的流程都可以在内核社区文档中找到,但是,单独学习需要一个较长的过程,新手难以入门,因此,本文整理当年的经验,给出一个简明的方法,供大家参考。如果本文中有和社区文档描述相矛盾的地方,应以社区文档为准。
内存管理子系统的维护者Andrew Morton在一次演讲时,观众提问如何参与内核贡献,能否出一个教程?印象中Andrew Morton的回答是,如果想参加Linux内核项目,应该先动手做起来。
1. 安装git和git send-email
笔者使用基于鲲鹏服务器的openEuler系统,首先使用yum
安装git
和git-email
。Ubuntu用户也可以使用apt
工具,斯不赘述。
yum install git
yum install git-email
其中,Yixuan Cao
为最终的patch中,发送者的名字;而caoyixuan2019@email.szu.edu.cn
指电子邮箱。
配置git和smtp
配置git的姓名和邮箱信息
打开~/.gitconfig
文件,在文件末尾添加如下信息(以腾讯企业邮箱为例):
[sendemail]smtpencryption = sslsmtpserver=smtp.exmail.qq.comsmtpuser=caoyixuan2019@email.szu.edu.cnsmtpserverport=465smtpass=***************
通过配置腾讯企业邮箱的信息,将git-email
和自己的邮箱账户绑定在一起。其中smtpuser
是指电子邮箱账号,smtpass
是私有的客户端密码,有了这个密码就可以无需验证,利用git
发送电子邮件。
3.下载和修改Linux kernel源码
使用git下载linux-next分支
下载并修改linux-next分支的代码,这样才能保证我们的工作是基于最新的linux代码。实际上,Linux内核供开发者开发和测试的版本为next版本,next版本经过若干迭代后,会在一个被社区称为“merge window”的时期内合入主线(mainline)版本,主线版本经过若干迭代后,会进入稳定版。下图为Linux内核社区主页。
使用git
下载linux-next
的命令如下:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
下载完成后,就会有一个当前目录下就会有一个linux的目录。进入之,查看当前的git
状态,然后,建立新的开发分支并切换到开发分支去。
git status
# 创建新分支
git branch develop
git checkout develop
接着,我们修改代码。需要注意的是,可以修改的不仅是代码实现,也可以是注释、文档等。修改完成后,在开发分支代执行:
git status
git add .
git commit -s -v
注意 git commit
命令会自动打开编辑器,用以编辑提交信息。-s
参数可以自动在你的提交信息下加上一行Signed-off-by: Yixuan Cao <caoyixuan2019@email.szu.edu.cn>
,-v
参数会在你的提交信息下方显示出你做的修改,确保你能再三检查自己的改动,这一个参数不是必须的,但是推荐这么做。提交信息务必规范,不规范的提交信息可能会被直接拒绝,至少会被认为是不礼貌的。最终这个git的提交会被制作成开源补丁(patch),以电子邮件的形式向维护者发送。
对于自动打开的编辑器,我们需要补充信息,其模板如下:
- 第一部分是 short description,以子系统名打头,比如 mm,注意分号后面加个空格。这一部分最终会作为补丁的标题,要让维护者一眼就看出这个补丁大概干了什么事。请注意,为了方便内核的维护者管理,应该遵循工作的文件中,前人提交时的命名惯例。 如内存管理子系统,常见的标题写法是:
mm/cma.c: fail if fixed declaration can't be honored
,而在别的场景中,也有这样的写法:arm64: dts: rockchip: fix rk3399 hdmi ports node
。 - 第二部分是 the body of your patch,这一部分要详细的解释你为何要做这个修改,以及怎么做的,注意时态用现在时,语态用主动形式。
- 第三部分是之前的
-s
参数自动加上的,表示邮件和署名,是自动生成的,不用管。
一个简单的示例如下:
mm: fix some errorWhy I do these changes and how I do it.Signed-off-by: Yixuan Cao <caoyixuan2019@email.szu.edu.cn>
如果commit
之后还想修改提交信息,使用命令 git commit --amend -v
,编辑器重新弹出。这些都是使用git
的基本能力,更复杂的功能可以自行学习。需要注意:如果一次需要修改多处功能,应该使用多次提交并生成patchset。
4. 生成补丁
以master
分支为基准,生成补丁。
git format-patch master
这条命令是以 master 分支为基准,检测你在当前 develop 分支所做的修改并生成 Patch 文件。
命令完成后,你就可以在当前目录下看到你的 Patch 文件了。
5. 检查patch和发送邮件
检查补丁格式,要做到 0 errors, 0 warnings
。
之所以要做这一件事,是因为补丁的格式有严格的限制。例如,为了维护者的阅读方便,输入的文本内容的每一行都不可太长。但是另一方面,这一行命令只能做简单的格式的检查,不能检查其是否能够通过编译、功能符合要求等。因此在提交之前,应该做好充分的测试。
./scripts/checkpatch.pl 0001-mm-page_owner.c-Modify-the-type-of-argument-order-in.patch
6.发送补丁
要将上补丁发送给社区维护者,需要查看相关的上游维护者的电子邮箱地址。例如要修改mm/page_owner.c,使用命令
./scripts/get_maintainer.pl -f mm/page_owner.c
当时的输出结果是:
Andrew Morton <akpm@linux-foundation.org> (maintainer:MEMORY MANAGEMENT)
linux-mm@kvack.org (open list:MEMORY MANAGEMENT)
linux-kernel@vger.kernel.org (open list)
根据输出结果,我们知道是Andrew Morton维护mm子系统。用如下命令,可以通过电子邮件发送补丁。需注意,参数--to
后接收件人,--cc
后接被抄送者。
git send-email --to akpm@linux-foundation.org \
--cc linux-mm@kvack.org \
--cc linux-kernel@vger.kernel.org \
*.patch
至此工作已经全部完成。如果补丁并入上游分支的话,会收到通知邮件;如果被打回,也会被告知有不妥之处。
相关文章:

如何向Linux内核提交开源补丁?
2021年,我曾经在openEuler社区上看到一项改进Linux内核工具的需求,因此参与过Linux内核社区的开源贡献。贡献开源社区的流程都可以在内核社区文档中找到,但是,单独学习需要一个较长的过程,新手难以入门,因此…...

python数据分析——pandas DataFrame基础知识2
参考资料:活用pandas库 1、分组方式 我们可以把分组计算看作“分割-应用-组合”(split-apply-combine)的过程。首先把数据分割成若干部分,然后把选择的函数(或计算)应用于各部分,最后把所有独立…...

TODESK远程开机的原理
在现代计算机技术飞速发展的背景下,远程控制软件成为我们日常工作中不可或缺的工具。其中,ToDesk作为一款高效且易用的远程控制软件,备受用户青睐。那么,ToDesk远程开机的原理是什么呢?本文将为你揭晓这个秘密。 KKVie…...

【c1】数据类型,运算符/循环,数组/指针,结构体,main参数,static/extern,typedef
文章目录 1.数据类型:编译器(compiler)与解释器(interpreter),中文里的汉字和标点符号是两个字节,不能算一个字符(单引号)2.运算符/循环:sizeof/size_t3.数组…...

word图片水印
一、word中旧水印如何删除 打开word模板,想要删除旧水印,如下图所示操作,但是旧水印删除不掉。 以为上传新水印图片会替换掉旧水印,结果显示了2个水印,要怎么删除呢? 如下截图所示,双击打开页…...

kali安装及替换源
一、安装及简单配置 1.安装:地址就不贴了,自己打一下就好 2.虚拟机中打开kali 3.替换包源 (1)使用指令打开/etc/apt/sources.list mousepad /etc/apt/sources.list (2)将内容替换成阿里云源 deb http://mirrors.aliyun.com/kali kali-rolling main n…...

JSpdf,前端下载大量表格数据pdf文件,不创建dom
数据量太大使用dom》canvas》image》pdf.addimage方法弊端是canvas超出 浏览器承受像素会图片损害,只能将其切割转成小块的canvas,每一次调用html2canvas等待时间都很长累积时间更长,虽然最终可以做到抽取最小dom节点转canvas拼接数据,但是死…...
PHP关联数组[区别,组成,取值,遍历,函数]
关联数组 相较于数值数组,关联数组的索引可以为字符串和数字,关联数组元素也可称为键值对,索引为键,值为值。 源码 <?php echo "<hr>"; //水平线标签//关联数组$arr3 array(); //创建空的数组//关联数…...

JavaWeb--13Mybatis(2)
Mybatis(2) 1 Mybatis基础操作1.1 需求和准备工作1.2 删除员工日志输入参数占位符 1.3 新增员工1.4 修改员工信息1.5 查询员工1.5.1 根据ID查询数据封装 1.5.3 条件查询 2 XML配置文件规范3 MyBatis动态SQL3.1 什么是动态SQL3.2 动态SQL-if更新员工 3.3 …...

如何远程控制另一部手机:远程控制使用方法
在现今高科技的社会中,远程控制手机的需求在某些情境下变得越来越重要。不论是为了协助远在他乡的家人解决问题,还是为了确保孩子的在线安全,了解如何实现这一功能都是有益的。本文将为您简要介绍几种远程控制手机的方法及其使用要点。 KKVi…...

x64dbg中类似于*.exe+地址偏移
在CE和xdb中,形如*.exe数字偏移形式的地址被称为模块地址,CE附加到进程后点击查看内存,显示如下图 这种地址学名叫做模块地址,在x64dbg中显示如下图: CE中可以关闭,从而显示绝对的虚拟地址,如下…...

ICode国际青少年编程竞赛- Python-1级训练场-基础训练1
ICode国际青少年编程竞赛- Python-1级训练场-基础训练1 1、 Dev.step(4)2、 Dev.step(-4) Dev.step(8)3、 Dev.turnLeft() Dev.step(4)4、 Dev.step(3) Dev.turnLeft() Dev.step(-1) Dev.step(4)5、 Dev.step(-1) Dev.step(3) Dev.step(-2) Dev.turnLeft() Dev.step(…...

Baidu Comate智能编码助手
Baidu Comate智能编码助手 🎈1.Baidu Comate的简介🎈2.安装Baidu Comate🎈3.Baidu Comate实现功能🎈4.使用注释进行智能代码提示🎈5.结束语 🎈1.Baidu Comate的简介 根据官网的介绍,我们了解到B…...

nginx自动部署-跨操作系统
项目里面有一个需求,就是需要用让nginx进程提供给系统管理一个start,stop和getPid方法,这样系统管理可以自动拉起来nginx,达到自动部署的目的。离线部署同样适用 这样一来,我就需要提供windows版本linux不同版本的nginx源码包&am…...

组合模式(结构型)
目录 一、前言 二、透明组合模式 三、安全组合模式 四、总结 一、前言 组合模式(Composite Pattern)是一种结构型设计模式,将对象组合成树形结构以表示“部分-整体”得层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式由以下角色组成…...

Pspice for TI学习
Pspice for TI中PSpice Part Search空白解决方法 配置环境变量 Cad_PSpice_TI_Regr_Srvr https://software-dl.ti.com/pspice/S009 重新安装2023版的Pspice Pspice安装链接 打开新安装的软件即可发现PSpice Part Search可以正常使用了 VSIN各参赛的含义 VOFF直流偏置VAMPL…...

LoRA的原理简介
在文章开始前先澄清一个概念,需要区分形近的单词"LoRa"(long range),这是一项通信技术。熟悉物联网行业的朋友相对会比较熟悉LoRa这项技术,因为有些设备比如电梯的控制就使用了这个技术进行本地数据和命令的…...

安卓使用Fiddler抓包 2024
简介 最近试了一下安卓使用fiddler 抓包,发现https包基本都会丢失。原因是Anandroid 7版本针对ssl安全性做了加强,不认可用户的证书。我们要做的就是把fiddler导出的证书进过处理后放置到系统证书目录下面,这样才能抓包https请求。 这里使用…...
【前端每日基础】day2 const var const的区别
var: 在早期的 JavaScript 中,var 是声明变量的唯一方式。它有以下特点: var 声明的变量是函数作用域(function-scoped),而不是块作用域(block-scoped),这意味着它们在整个函数内部都…...

乡村振兴的文化旅游融合:整合乡村文化资源与旅游资源,发展文化旅游产业,提升美丽乡村的文化内涵和旅游吸引力
一、引言 随着城市化进程的加速和人们精神文化需求的日益增长,乡村旅游逐渐成为旅游市场的新热点。乡村振兴战略的提出,为乡村旅游的发展提供了新的契机。在这一背景下,如何整合乡村文化资源与旅游资源,发展文化旅游产业…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...