如何向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),这意味着它们在整个函数内部都…...
乡村振兴的文化旅游融合:整合乡村文化资源与旅游资源,发展文化旅游产业,提升美丽乡村的文化内涵和旅游吸引力
一、引言 随着城市化进程的加速和人们精神文化需求的日益增长,乡村旅游逐渐成为旅游市场的新热点。乡村振兴战略的提出,为乡村旅游的发展提供了新的契机。在这一背景下,如何整合乡村文化资源与旅游资源,发展文化旅游产业…...
力扣题目101:对称二叉树
作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析…...
struct和union大小计算规则
Union 一:联合类型的定义 联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体) 比如:共用了 i 这个较大的空间 二: 联合的…...
数据库课程设计《基于Spring Boot + MyBatis + MySQL 实现Java医院药品管理系统》+源代码
文章目录 源代码下载地址项目介绍项目功能 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目功能 库存管理 登记入库的药品。 登记出库的药品。 每日检查库存下限,报警。 每日检查过期的药品,报警并做退回销毁处理。 对有问题…...
【每日力扣】98. 验证二叉搜索树 与 108. 将有序数组转换为二叉搜索树
🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害 98. 验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&a…...
Django3 个人开发笔记
查询函数 select_related 在 Django ORM 中,select_related 是一个查询性能优化工具,用于解决关联对象的查询效率问题。当你有两个通过外键(ForeignKey)或一对一字段(OneToOneField)连接的模型时…...
【全开源】Java U U跑腿同城跑腿小程序源码快递代取帮买帮送源码小程序+H 5+公众号跑腿系统
特色功能: 智能定位与路线规划:UU跑腿小程序能够利用定位技术,为用户提供附近的跑腿服务,并自动规划最佳路线,提高配送效率。订单管理:包括订单查询、订单状态更新、订单评价等功能,全行业覆盖…...
物联网实战--平台篇之(五)账户界面
目录 一、界面框架 二、首页(未登录) 三、验证码登录 四、密码登录 五、帐号注册 六、忘记密码 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/cat…...
9. Django Admin后台系统
9. Admin后台系统 Admin后台系统也称为网站后台管理系统, 主要对网站的信息进行管理, 如文字, 图片, 影音和其他日常使用的文件的发布, 更新, 删除等操作, 也包括功能信息的统计和管理, 如用户信息, 订单信息和访客信息等. 简单来说, 它是对网站数据库和文件进行快速操作和管…...
ELK+kafka日志采集
ElasticSeach(存储日志信息) Logstash(搬运工) Kibana 连接ElasticSeach图形化界面查询日志 ELK采集日志的原理: 在每个服务器上安装LogstashLogstash需要配置固定读取某个日志文件Logstash将日志文件格式化为json的…...
【C++ list所有函数举例如何使用】
C 中的 std::list 是一个双向链表,提供了在列表中添加、删除、访问元素等操作的方法。以下是一些常用的 std::list 函数以及如何使用它们的示例: push_back(const T& value): 在列表的末尾添加一个值为 value 的元素。 std::list<int> mylis…...
携程网站的会计工作怎么做/百度网站官网
iOS 14.3 Beta2距离苹果推送 iOS 14.3 首个测试版时隔 5 天,苹果今天又向参与测试的 iPhone 设备推送 iOS 14.3 Beta2 更新。这次的更新包比较小,只有 390MB 左右,更新后的版本号为 18C5054c,单纯地从版本号的后缀来看,…...
南通个人网站制作/网络营销环境宏观微观分析
周数 专业学习目标 专业学习时间 新增代码数量 博客发表量 人文方面的学习 知识技能总结 6 栈、链栈、栈队,网页设计表格 30小时 103 2 《世界是数字的》 栈的输入是从栈顶开始;网页表格的设置可以通过代码更快的建成。 转载于:https://www…...
网络工程有限公司/品牌企业seo咨询
965. 单值二叉树 难度简单69 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。 示例 1: 输入:[1,1,1,1,1,null,1] 输出:true示例…...
html5网站搭建/电脑优化大师有用吗
作者:老K玩代码来源:toutiao.com/i6882755471015576072Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。…...
自建网站营销是什么意思/网络营销的目标
我有简单的Django项目名称阿贾克斯。而我安装了这个项目的名称促销码只有一个应用程序。 我在这个项目中的问题是js和python之间的Ajax调用。我不能使用ajax调用函数处理Succes。错误:函数()结果我得到了。 我知道我在Ajax调用函数促销码的应用程序和URL映射urls.py…...
设计师网站图片/如何营销推广
DHCP 协议简介DHCP是Dynamic Host Configuration Protocol的缩写,它的前身是BOOTP。DHCP可以说是BOOTP的增强版本,是基于C/S模式的,它提供了一种动态指定IP地址和配置参数的机制。服务器端监听UDP 67端口,客户端使用UDP 68端口DHC…...