如何向Linux内核提交开源补丁?

2021年,我曾经在openEuler社区上看到一项改进Linux内核工具的需求,因此参与过Linux内核社区的开源贡献。贡献开源社区的流程都可以在内核社区文档中找到,但是,单独学习需要一个较长的过程,新手难以入门,因此,本文整理当年的经验,给出一个简明的方法,供大家参考。如果本文中有和社区文档描述相矛盾的地方,应以社区文档为准。

内存管理子系统的维护者Andrew Morton在一次演讲时,观众提问如何参与内核贡献,能否出一个教程?印象中Andrew Morton的回答是,如果想参加Linux内核项目,应该先动手做起来。

1. 安装git和git send-email

笔者使用基于鲲鹏服务器的openEuler系统,首先使用yum安装gitgit-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内核社区主页。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

至此工作已经全部完成。如果补丁并入上游分支的话,会收到通知邮件;如果被打回,也会被告知有不妥之处。

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

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

相关文章

AI 数据观 | TapData Cloud + MongoDB Atlas:大模型与 RAG 技术有机结合,落地实时工单处理智能化解决方案

本篇为「AI 数据观」系列文章第二弹&#xff0c;在这里&#xff0c;我们将进一步探讨 AI 行业的数据价值。以 RAG 的智能工单应用场景为例&#xff0c;共同探索如何使用 Tapdata Cloud MongoDB Atlas 实现具备实时更新能力的向量数据库&#xff0c;为企业工单处理的智能化和自…

[C/C++] -- 大数的加减法

大数加减法的问题主要产生于计算机基本数据类型的表示范围限制。通常情况下&#xff0c;计算机采用有限位数的数据类型&#xff08;如int、long&#xff09;来表示整数&#xff0c;这些数据类型的表示范围有限&#xff0c;无法表示超出范围的大整数。 例如超过了long类型的表示…

【JavaScript】内置对象 - 数组对象 ⑤ ( 数组转字符串 | toString 方法 | join 方法 )

文章目录 一、数组转字符串1、数组转字符串 ( 逗号分割 ) - toString()2、数组转字符串 ( 自定义分割符 ) - join() Array 数组对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array 一、数组转字符串 1、数组转字符串 ( 逗…

指针(脑图梳理)

今天让我们来梳理一下指针都有哪些概念吧 这个脑图是整理的一些指针相关知识的概念&#xff0c;希望对大家有帮助

Web前端开发 小实训(三) 商品秒杀小练习

学生能够在本次实训中完成商品秒杀页面的基本逻辑 任务要求 能够实现某一个商品的秒杀&#xff0c;在倒计时结束后不再进行秒杀。 操作步骤 1、打开预设好的页面 <html><head><meta charset"utf-8"><title>秒杀</title><link …

python中如何把list变成字符串

python中如何把list变成字符串&#xff1f;方法如下&#xff1a; python中list可以直接转字符串&#xff0c;例如&#xff1a; data ["hello", "world"] print(data1:,str(data)) 得到结果&#xff1a; (data1:, "[hello, world]") 这里将整个…

视频号小店究竟有什么秘密,值得商家疯狂入驻,商家必看!

大家好&#xff0c;我是电商花花。 我们都知道视频号和抖音本身都是一个短视频平台&#xff0c;但是随着直播电商的发展&#xff0c;背后的流量推动逐步显露出强大的红利市场和变现机会。 视频号小店流量大和赚钱之外&#xff0c;还非常适合普通人创业。 这也使得越来越多的…

easypoi动态表头导出数据

需求&#xff1a;动态导出某年某月用户和用户评分数据信息&#xff0c;表头(序号、姓名、用户姓名)&#xff0c;数据(所有用户对应的评分以及平均分)&#xff1b; 分析&#xff1a;1、表头除过序号、姓名&#xff0c;用户姓名要动态生成&#xff1b; 2、用户评分信息要和表头中…

【赠书活动第4期】《Rust编程与项目实战》

赠书活动 《Rust编程与项目实战》免费赠书 3 本&#xff0c; 收到赠书之后&#xff0c;写一篇 本书某一节内容 的学习博客文章。 可在本帖评论中表示参加&#xff0c;即可获得赠书&#xff0c;先到先得。学习心得博客链接&#xff0c;后面有空发上来。 赠书截止日期为送出3…

无人播剧直播收益在哪里!快手无人播剧新秘籍:版权无忧,日入四位数攻略

无人播剧顾名思义就是通过短视频平台直播不需要真人出镜受众群体通过网络短视频平台看到的经典影视剧集可以实现24小时不停断的播放利用多种途径变现的一种直播形式 1、操作简单、不露脸、不出镜2、手机、电脑都可以操作3、可以矩阵操作4、0粉丝、0作品、0保证金就可以开播5、…

2010-2030年GHS-POP数据集下载

扫描文末二维码&#xff0c;关注微信公众号&#xff1a;ThsPool 后台回复 g008&#xff0c;领取 2010-2030年100m分辨率GHS-POP 数据集 &#x1f4ca; GHS Population Grid (R2023)&#xff1a;全球人口分布的精准视图与深度应用 &#x1f310; 在全球化和快速城市化的今天&am…

[嵌入式系统-73]:RT-Thread-快速上手:如何选择RT Thread的版本?

目录 如何选择合适的 RT-Thread 版本进行开发&#xff1f; RT-Thread 分支与版本介绍 如何选择 发布版本&#xff08;GitHub releases&#xff09; 开发分支&#xff08;GitHub master 主分支&#xff09; 长期支持分支&#xff08;GitHub lts-v3.1.x 分支&#xff09; …

10.轮转数组

文章目录 题目简介题目解答解法一&#xff1a;使用额外的数组代码&#xff1a;复杂度分析&#xff1a; 解法二&#xff1a;数组反转代码&#xff1a;复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 轮转数组 相关的讲解&#xff01;&#…

STM32:EXTI—外部中断的初始化

文章目录 1、中断1.2 中断系统1.3 中断执行流程 2、STM32中断2.2EXTI&#xff08;外部中断&#xff09;2.3 EXTI 的基本结构2.4 AFIO复用IO口 3、NVIC基本结构3.2 NVIC优先级分组 4、配置EXTI4.2 AFIO 库函数4.3 EXTI 库函数4.4 NVIC 库函数4.5 配置EXTI的步骤4.6 初始化EXTI 1…

Python运维之协程

目录 一、定义协程 二、并发 三、异步请求 协程是一种轻量级的线程&#xff0c;它通过保存和恢复寄存器上下文和栈来实现调度切换&#xff0c;从而保留函数执行的状态。 这种机制使得协程在处理I/O密集型任务时效率较高&#xff0c;因为它们可以在I/O操作期间让出CPU&#…

QT——tableWidget-跳变之舞V1.0-记录学习【1】

QT——tableWidget-跳变之舞V1.0-记录学习【1】 文章目录 QT——tableWidget-跳变之舞V1.0-记录学习【1】前言一、利用QT创建项目文件1.1 完整项目文件如下图所示:1.2 演示&#xff1a; 二、声明文件&#xff1a;2.1 主界面声明文件:mainwindow.h&#xff1b;2.2 控制窗口声明文…

科技查新中医学科研项目查新点如何确立与提炼?案例讲解

一、前言 医学科技查新包括立项查新和成果查新两个部分&#xff0c;其中医学立项查新&#xff0c;它是指在医学科研项目申报开题之前&#xff0c;通过在一定范围内进行该课题的相关文献检索 ( 可以根据项目委托人的具体要求&#xff0c;进行国内检索或者进行国外检索 ) &#x…

区块链(打新)如何被割韭菜

看上去&#xff0c;像我只要去每个都买一遍新发行的代币&#xff0c;一定可以成功的 但是好像没有想象中这么简单&#xff0c;因为这些山寨币&#xff0c;庄家可以自己控盘的&#xff0c;看上去好像有跌宕起伏的买卖&#xff0c;但是一单掀桌子&#xff0c;庄家他自己都不玩了…

Python之数据分析基础

导言&#xff1a; “21世纪的竞争是数据的竞争&#xff0c;谁掌握数据&#xff0c;谁就掌握未来”。如何将大量看似杂乱无章的数据进行聚合&#xff0c;并发现潜在的规律也变得越来越重要。本文将先说明数据分析的步骤&#xff0c;再通过python完成实例数据的处理、分析最终展…

TDM(BPM)-MIMO-FMCW雷达MATLAB仿真

本文通过对车载毫米波雷达信号流程和链路的仿真&#xff0c;建立基本的算法框架&#xff0c;可用于算法性能的验证。并提供基础MATLAB仿真代码&#xff0c;作为分享和参考。 一、信号的产生 车载毫米波雷达广泛使用线性调频连续波雷达&#xff0c;也即发射信号频率随时间线性变…