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

news2024/10/5 15:25:46

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 = ssl
        smtpserver=smtp.exmail.qq.com
        smtpuser=caoyixuan2019@email.szu.edu.cn
        smtpserverport=465
        smtpass=***************

通过配置腾讯企业邮箱的信息,将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 error

Why 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.coloradmin.cn/o/1658562.html

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

相关文章

springboot+vue+mybatis警情高发智能灯箱+PPT+论文+讲解+售后

时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;警情高发智能灯箱当然不能排除在外。警情高发智能灯箱是在实际应用和软件工程的开发原理之上&#xff0c;运用微信开发者、java语言以及SpringBo…

超标量处理器设计:寄存器重命名(1)介绍

★继续学习体系结构的知识。 指令之间的相关性 1.数据相关性 具体分为三类&#xff1a; (1) Output Dependence (WAW)&#xff1a;当两条指令尝试向同一个寄存器写入数据时发生。后面的写操作必须等待前面的写操作完成&#xff0c;因为它们争夺同一资源。 (2) Anti-Depende…

大厂面试sql手撕题目总结

文章目录 1. 常用函数1. 日期函数 2. 行转列&#xff08;转置&#xff09;1. 行转列 连续N天登录1. 查询出连续三天登录的人员姓名 N日留存率1. 求用户当天&#xff0c;次日&#xff0c;七日留存率 分组内topN1. 求出每个部门工资最高的前三名员工&#xff0c;并计算这些员工的…

AWS Cli Windows安装配置

1. 安装 下载地址&#xff1a;AWS 命令行界面(CLI)_管理AWS服务的统一工具-AWS云服务 检验安装&#xff1a; > aws --version aws-cli/2.15.44 Python/3.11.8 Windows/10 exe/AMD64 prompt/off 2. 创建IAM用户 1) 创建组 选择IAM 点击创建组 填写用户组名&#xff0c;…

YOLOv5改进 | 独家创新篇 | 利用MobileNetV4的UIB模块二次创新C3(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是利用MobileNetV4的UIB模块二次创新C3&#xff0c;其中UIB模块来自2024.5月发布的MobileNetV4网络&#xff0c;其是一种高度优化的神经网络架构&#xff0c;专为移动设备设计。它最新的改动总结主要有两点&#xff0c;采用了通用反向瓶…

synchronized关键字和ReentrantLock锁区别

synchronized关键字和ReentrantLock锁是Java中用于同步的两个重要机制&#xff0c;它们在很多方面有所不同&#xff1a; 1. **锁定范围**: synchronized关键字只能在方法的执行过程中提供锁定&#xff0c;而ReentrantLock可以锁定任何对象&#xff0c;包括方法、代码块和对象。…

django项目结构介绍

小白的django学习笔记 五一前的某天 文章目录 django项目结构介绍项目的基本配置templates项目模块manage.pyExternal Libraries django项目结构介绍 项目的基本配置 在这里配置&#xff0c;跟工程名是一样的 templates 放网页、js、css的地方 django 项目模块 项目开发时&…

Android Studio高版本安卓模拟器抓取https包

Android Studio avd 设置 证书生成 *.cer格式证书​ openssl x509 -inform DER -subject\_hash\_old -in charles-ssl-proxying-certificate.cer​ *.pem格式证书​ openssl x509 -inform PEM -subject\_hash\_old -in charles-ssl-proxying-certificate.pem会输出 2cb30a9e …

QX------mini51单片机学习------(5)数码管的静态与动态显示

目录 1数码管应用场景 2数码管显示原理 3静态与动态显示 474HC573锁存器工作原理 5上拉电阻的作用 6原理图分析 7实践 1数码管应用场景 2数码管显示原理 图&#xff08;b&#xff09;左边是共阴极&#xff0c;右边是共阳极 GND是公共极&#xff0c;可以用万用表测&am…

【JavaEE初阶系列】——理解Cookie 和 Session以及相关API

目录 &#x1f6a9;Cookie &#x1f6a9;Session &#x1f6a9;Servlet API &#x1f388;HttpServletRequest &#x1f388;HttpSession &#x1f6a9;Cookie http请求header中一个属性&#xff0c;浏览器持久化存储数据的一种机制&#xff0c;网页无法访问主机的文件系…

技术速递|Python in Visual Studio Code 2024年4月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展 2024 年 4 月发布&#xff01; 此版本包括以下公告&#xff1a; 改进了 Flask 和 Django 的调试配置流程Jupyter Run Dependent Cells with Pylance 的模块和导入分析Hatch 环境发…

【Leetcode每日一题】 综合练习 - 逆波兰表达式求值(难度⭐⭐)(73)

1. 题目解析 题目链接&#xff1a;150. 逆波兰表达式求值 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 数据结构选择&#xff1a; 使用栈&#xff08;stack<int>&#xff09;来存储操作数&#xff0c;以便进…

OpenHarmony 3.2 Release版本实战开发——Codec HDI适配过程

简介 OpenHarmony Codec HDI&#xff08;Hardware Device Interface&#xff09;驱动框架基于 OpenMax 实现了视屏硬件编解码驱动&#xff0c;提供 Codec 基础能力接口供上层媒体服务调用&#xff0c;包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁…

OpenMVS学习笔记(一):WSL编译安装测试

1.CUDA和CUDNN安装 [1] WSL版本cuda安装&#xff1a; >> wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin >> sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600 >> wg…

Burp Suite (bp)启动激活报错问题

一、自查 1、从哪里下载程序 【大部分同学的问题&#xff0c;都是重新下载解决的&#xff0c;简单快速直接】 一律使用“常用软件”中提供的Burp Suite软件包&#xff0c;方便排查问题 自带JDK的版本 Burp 2024.3&#xff0c;自带JDK21&#xff0c;双击bat即可启动&#xff…

YOLOv8网络结构介绍

将按照YOLOv8目标检测任务、实例分割任务、关键点检测任务以及旋转目标检测任务的顺序来介绍&#xff0c;主要内容也是在目标检测任务中介绍&#xff0c;其他任务也只是Head层不相同。 1.YOLOv8_det网络结构 首先&#xff0c;YOLOv8网络分成了三部分&#xff0c;分别是主干网络…

Java | Spring框架| 集合与复杂类型的注入:处理多值依赖

集合与复杂类型的注入&#xff1a;处理多值依赖 在Spring框架中&#xff0c;除了可以注入简单的依赖类型&#xff0c;如字符串、整数等&#xff0c;还可以注入集合类型和复杂类型的数据。集合类型包括List、Set、Map和数组&#xff0c;而复杂类型可以是自定义的对象、配置类等…

【JavaEE网络】用Form与Ajax构建HTTP请求

目录 通过 form 表单构造 HTTP 请求form 发送 GET 请求form 发送 POST 请求 通过 ajax 构造 HTTP 请求发送 GET 请求发送 POST 请求发送 application/json 数据封装 ajax 方法 通过 form 表单构造 HTTP 请求 form (表单) 是 HTML 中的一个常用标签. 可以用于给服务器发送 GET …

janus源码分析

基础说明 janus官网 https://janus.conf.meetecho.com/index.html janus源码地址 https://github.com/meetecho/janus-gateway 编译及部署参考 https://pro-hnb.blog.csdn.net/article/details/137730389?spm1001.2014.3001.5502 https://pro-hnb.blog.csdn.net/article/deta…

QT设计模式:策略模式

基本概念 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列方法&#xff0c;并使它们可以相互替换。策略模式使得算法可以独立于客户端而变化&#xff0c;使得客户端可以根据需要选择相应的算法。 策略模式通常由以下角色组…