- 作者: 陈孝松
- 主页: chenxiaosong.com
- 哔哩哔哩: 陈孝松
- 课程: chenxiaosong.com/courses
- 博客: chenxiaosong.com/blog
- 贡献: chenxiaosong.com/contributions
- 邮箱: [email protected]
- QQ交流群: 544216206, 点击查看群介绍
点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)。
内核社区
说到Linux内核,很多人可能会认为只有Linus这样的神才懂。但事实是任何人都能参与,比如我这样能力差的也参与到Linux内核社区了。可能很多人早就想贡献Linux内核了,但就是不知道怎么开始。
Linux内核有一个官方网站The Linux Kernel Archives,在这个网站上可以获取Linux内核源码以及其他相关源码。
Linux内核社区主要以邮件交流为主,以下是一些常用的网站:
- 邮件列表: 在这里获取社区的最新动态。
- 按模块划分的patchwork: 补丁的邮件都会在这里归档。
- bugzilla: 上面有很多未解决的bug,想在社区提补丁可以在这上面找问题。
- syzbot: 谷歌的syzkaller模糊测试跑出来的bug,想在社区提补丁也可以在这上面找问题。
- kernelnewbies: 适合内核初学者看的黑客。
- LWN.net: Linux新闻周刊。
内核源码树
我们以社区最近的一个LTS(longterm support,长期维护版本)v6.6的代码来讲接下来的课程。
内核源码树根目录每个文件夹的描述如下(按字母顺序):
arch
: architecture的缩写,体系结构相关。我们着重介绍arch/x86/
和arch/arm64/
,在每个体系结构目录下,boot/
是启动相关,configs/
是配置相关,include/
头文件相关,mm/
内存管理相关,等等。block
: 块设备IO层相关。certs
: 认证相关。crypto
: 加密API,加密、散列、压缩、校验等算法。Documentation
: 文档,要多看,很有用。也可以看在线文档: https://www.kernel.org/doc/html/latest/drivers
: 设备驱动程序相关。fs
: 文件系统相关。我们主要介绍fs/
目录下VFS(虚拟文件系统)相关的,还会介绍几个具体的文件系统,如fs/ext2/
、fs/xfs/
、fs/proc/
、fs/sysfs/
等,当然具体的文件系统不会介绍得很详细,只说一个大概,主要还是以VFS的讲解为主。include
: 内核头文件相关。init
: 内核引导和初始化相关。io_uring
: 5.1版本引入的高性能异步IO框架,主要是为了加快IO密集型应用的性能。ipc
: 进程间通信相关。kernel
: 进程相关,包括进程管理和进程调度。lib
: 可以看成是一个标准C库的子集,如strlen
、mmcpy
、sprintf
等函数。LICENSES
: 许可证。mm
: 与体系结构无关的内存管理代码,注意与体系结构相关的代码在arch/mm/
目录下。net
: 网络子系统,如TCP/IP等网络协议的实现。rust
: 内核除了C语言外采用的一门新开发语言,和C性能差不多,目前暂时主要用于驱动开发。samples
: 示例代码,很好的学习资源,不要放过。scripts
: 脚本文件,如make menuconfig
、make scripts_gdb
等都是调用这个目录下的脚本。security
: 安全模块,比如复杂的selinux
。sound
: 语音子系统相关。tools
: 开发工具相关。usr
: 早期的用户空间代码(initramfs
),比如有打包和压缩用的cpio
等。注意,usr
的全称是Unix System Resources
,不是user
,不是user
,不是user
。为什么要强调不是user
呢,因为有太多太多的人读成了user
,咱们专业点,读成u, s, r
,一个单词一个单词的读。virt
: 虚拟化相关,如kvm
。
上面是文件夹,接下来介绍根目录下的文件:
COPYING
: 许可证。CREDITS
: 贡献者。Kbuild
: 内核顶层目录的Kbuild
, 在进入子目录之前准备全局头文件并检查完整性。Kconfig
: 内核配置。MAINTAINERS
: 维护者名单。Makefile
: 设置编译参数。README
: 描述文档在哪里。
贡献Linux内核社区
准备补丁
你可以通过bugzilla或syzbot发现内核bug,也可以通过阅读内核代码发现bug或进行重构。或者可以用calc-func-lines.sh
脚本找到长函数(不容易阅读)进行重构。
可以参考内核仓库中的补丁,比如我提交的补丁。修改代码时要参考Linux内核代码风格。
注意commit message每行长度不超过 72 个字符。
git commit
命令之后,使用以下命令会生成补丁文件:
# -1 表示最后一次commit,
git format-patch -1
# 指定commit号
git format-patch --subject-prefix="PATCH next" -1 <commit号>
# 如果是第2个版本或第3个版本,需要指定v2或v3
git format-patch --subject-prefix="PATCH v2" -1
# 如果内容不变,重新发送(比如加一个抄送的人)
git format-patch --subject-prefix="PATCH resend,v2" -1
# 从指定的commit号数向前3个,共生成3个补丁
git format-patch --subject-prefix="PATCH resend,v2" -3 <commit号>
# 生成补丁集
git format-patch --subject-prefix="PATCH resend,v2" -3 commit号 --cover-letter
# 编辑0000-cover-letter.patch, 可参考patchwork上其他补丁的写法
vim 0000-cover-letter.patch
邮箱配置
- 163邮箱配置: 默认情况下,163邮箱只能在网页和网易邮箱大师登录。如果要用git通过163邮箱发送邮件则需要对163邮箱进行配置。在pc端网页登录163邮箱,点击“设置 --> POP3/SMTP/IMAP”,开启SMTP服务,会弹出授权密码窗口,记下这个授权密码(也可以在下方新增授权密码或删除)。
- foxmail邮箱(qq邮箱)配置: 在pc端网页登录foxmail邮箱,点击"Settings -> Third-party Services -> IMAP/SMTP", 点击"Generate Authorization Code"生成在
.gitconfig
和thunderbird中登录的密码。 - 腾讯企业邮箱配置: 登录腾讯企业邮箱个人账号(不是管理员),左上角“设置”,然后“邮箱绑定 -> 客户端专用密码 -> 生成新密码“,注意要记住这个密码,只会显示一次,忘记了就要重新生成密码。thunderbird中登录时的配置:
- 收件服务器: 协议IMAP,主机名: imap.exmail.qq.com,端口: 993(或不填),连接安全性: 自动检测。
- 发件服务器: 主机名: smtp.exmail.qq.com,端口: 465(或不填),连接安全性: 自动检测。
thunderbird邮件客户端
最新版本的thunderbird默认使用html格式发送和显示,需要更改配置,参考Plain text e-mail - Thunderbird。
依次点击 Account Settings(账户设置) -> 地址簿 -> Composition & Addressing -> Composition(编写) -> 取消勾选 Compose messages in HTML format(以html格式编写消息)
。
thunderbird有个快捷键k
,会忽略话题,不小心按下后邮件就会不再显示,可以在查看 -> 话题
里勾选已忽略话题
,就能看到不小心按下k
而不显示的邮件。
还有,不建议订阅内核任何模块的邮件列表,因为太多了,一旦订阅邮箱基本就爆了,可以在邮件列表网站上选择对应的模块在线浏览,如果需要回复,可以把邮件下载下来保存成文件,然后用thunderbird打开文件,然后就可以回复了。如果实在要订阅,可以访问vger.kernel.org和linux-kernel mailing list FAQ。
git发送邮件
安装软件:
sudo apt install git-email -y
163邮箱~/.gitconfig
:
[sendemail]
from = [email protected]
smtpserver = smtp.163.com
smtpuser = [email protected]
smtpencryption = ssl
smtppass = 此处填写163邮箱的授权密码
smtpserverport = 994
foxmail(qq)邮箱~/.gitconfig
:
[sendemail]
from = [email protected]
smtpserver = smtp.qq.com
smtpuser = [email protected]
smtpencryption = ssl
smtppass = 此处填写qq邮箱的授权密码
腾讯企业邮箱~/.gitconfig
:
[sendemail]
from = your_name@your_name.com
smtpserver = smtp.exmail.qq.com
smtpuser = your_name@your_name.com
smtpencryption = ssl
smtppass = 此处填写腾讯企业邮箱的授权密码
smtpserverport = 465
获取maintainer邮箱:
./scripts/get_maintainer.pl file1.patch
发送邮件:
# --to是主送,--cc是抄送
git send-email [email protected],[email protected] [email protected],[email protected] file1.patch file2.patch
标签:--,patch,源码,内核,Linux,邮箱,com
From: https://blog.csdn.net/chenxiaosongcsdn/article/details/141956169