内核源码介绍

点击这里在哔哩哔哩bilibili在线观看配套的教学视频

点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)

点击跳转到内核课程所有目录

1 内核社区

说到Linux内核,很多人可能会认为只有Linus这样的神才懂。但事实是任何人都能参与,比如我这样能力差的也参与到Linux内核社区了。可能很多人早就想贡献Linux内核了,但就是不知道怎么开始。

Linux内核有一个官方网站The Linux Kernel Archives,在这个网站上可以获取Linux内核源码以及其他相关源码

Linux内核社区主要以邮件交流为主,以下是一些常用的网站:

2 openEuler社区

openEuler托管在gitee上,贡献openEuler要通过提交Pull Requests。

CLA 协议是开源贡献协议,用于规范贡献者的权利及义务。贡献者在贡献openEuler社区前,需要签署CLA签署流程。如果你是以公司邮箱贡献,且公司已经签了CLA,你应该选择“法人贡献者登记”;如果你是以个人邮箱贡献,选择“签署个人CLA”。注意仓库下.git/config~/.gitconfig中的邮箱配置要求必须是签署了CLA的邮箱,用git log --pretty=fuller可以查看commit的邮箱。

Kernel SIG | openEuler Kernel 补丁合入规范,可以用 脚本create-openeuler-git-msg.sh 生成openEuler补丁需要的格式。

3 内核源码树

我们以社区最近的一个LTS(longterm support,长期维护版本)v6.6的代码来讲接下来的课程。

内核源码树根目录每个文件夹的描述如下(按字母顺序):

上面是文件夹,接下来介绍根目录下的文件:

4 贡献Linux内核社区

4.1 准备补丁

你可以通过bugzillasyzbot发现内核bug,也可以通过阅读内核代码发现bug或进行重构。 或者可以用calc-func-lines.sh脚本 找到长函数(不容易阅读)进行重构。

可以参考内核仓库中的补丁 ,比如我提交的补丁 。修改代码时要参考Linux内核代码风格

注意commit message每行长度不超过 72 个字符。

git commit命令之后,使用以下命令会生成补丁文件:

# -1 表示最后一次commit
# 如果文件名较长,可以加 --stat=300,200 显示完整路径
git format-patch -1 --stat=300,200

# 指定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

4.2 邮箱配置

4.3 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.orglinux-kernel mailing list FAQ

4.4 git发送邮件

安装软件:

sudo apt install git-email -y

163邮箱~/.gitconfig:

[sendemail]
    from = your_name@163.com
    smtpserver = smtp.163.com
    smtpuser = your_name@163.com
    smtpencryption = ssl 
    smtppass = 此处填写163邮箱的授权密码
    smtpserverport = 994 

foxmail(qq)邮箱~/.gitconfig:

[sendemail]
        from = your_name@foxmail.com
        smtpserver = smtp.qq.com
        smtpuser = your_name@foxmail.com
        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 --to=to1@example.com,to2@example.com --cc=cc1@example.com,cc2@example.com file1.patch file2.patch

可以使用脚本get-maintainer-email.sh来获取邮箱:

git format-patch -1 1aee9158bc97
bash get-maintainer-email.sh fs/nfs/ fs/nfsd fs/nfs_common 0001-nfsd-lock_rename-needs-both-directories-to-live-on-t.patch