- 作者: 陈孝松
- 主页: chenxiaosong.com
- 哔哩哔哩: 陈孝松
- 课程: chenxiaosong.com/courses
- 博客: chenxiaosong.com/blog
- 贡献: chenxiaosong.com/contributions
- 邮箱: chenxiaosong@chenxiaosong.com
- QQ交流群: 544216206, 点击查看群介绍
点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)。
下面介绍Linux内核编译环境和测试环境的搭建过程,当然我也为各位朋友准备好了已经安装好的虚拟机镜像,只需下载运行即可。
点击这里从百度网盘下载对应平台的虚拟机镜像,x86_64
(也就是你平时用来安装windows系统的电脑,或者2020年前的苹果电脑)选择ubuntu-x64_64.zip
,arm64
(2020年末之后的苹果电脑)选择ubuntu-aarch64.zip
。虚拟机运行后,登录界面的密码是1
。
使用code-server浏览和编辑代码
为了尽可能的方便,推荐使用code-server在网页上浏览和编辑代码,当然你也可以使用自己习惯的代码浏览和编辑工具。
code-server源码托管在GitHub,安装命令:
curl -fsSL https://code-server.dev/install.sh | sh
或者下载对应系统的安装包。
设置开机启动:
sudo systemctl enable --now code-server@$USER
配置文件是${HOME}/.config/code-server/config.yaml
,当不需要密码时修改成auth: none
。
修改完配置后,需要再重启服务:
sudo systemctl restart code-server@$USER
然后打开浏览器输入http://localhost:8888
(8888
是${HOME}/.config/code-server/config.yaml
配置文件中配置的端口)。
有些格式的文件可能不会自动换行显示,可以勾选View -> Word Wrap
。
注意,和vscode客户端不一样,vscode server装插件时有些插件无法搜索到,这时就需要在vscode网站上下载.vsix
文件,手动安装。
常用插件:
-
C语言(尤其是内核代码)推荐使用插件C/C++ GNU Global。使用命令
sudo apt install global -y
安装gtags插件,Linux内核代码使用命令make gtags
生成索引文件。 -
C++语言推荐使用插件C/C++或clangd。浏览C/C++代码时,建议这两个插件和C/C++ GNU Global选一个,不要安装多个。
-
Vue.js推荐使用插件Vetur、Vue Peek、ESLint、Bracket Pair Colorizer 2、VueHelper
-
markdown插件Markdown Preview Enhanced
当想在vscode客户端打开远程的文件时, 可以使用 remote-ssh插件.
Woboq CodeBrowser
https://github.com/KDAB/codebrowser
git的一些特殊用法
这里我们不介绍git的一般用法,仅介绍一些特殊用法。
查看帮助文档man 1 git log
:
-L<start>,<end>:<file>, -L:<funcname>:<file>
跟踪给定 <start>,<end> 或函数名正则表达式 <funcname> 所定义的行范围的演变,位于 <file> 内。您不可以提供任何路径规范限定符。目前此功能仅限于从单个修订版本开始的遍历,即您只能提供零个或一个正面修订参数,<start> 和 <end>(或 <funcname>)必须存在于起始修订版本中。您可以多次指定此选项。隐含--patch。可以使用 --no-patch 抑制补丁输出,但当前尚未实现其他差异格式(即 --raw、--numstat、--shortstat、--dirstat、--summary、--name-only、--name-status、--check)。
<start> 和 <end> 可以采用以下形式之一:
• 数字
如果 <start> 或 <end> 是数字,则指定绝对行号(从 1 开始计数)。
• /正则表达式/
此形式将使用与给定 POSIX 正则表达式匹配的第一行。如果 <start> 是正则表达式,则它将从前一个 -L 范围的末尾开始搜索,如果有的话,否则从文件开头开始搜索。如果 <start> 是 ^/正则表达式/,则它将从文件的开头开始搜索。如果 <end> 是正则表达式,则它将从由 <start> 给出的行开始搜索。
• +偏移量 或 -偏移量
这仅对 <end> 有效,并将指定相对于由 <start> 给出的行之前或之后的行数。
如果 :<funcname> 出现在 <start> 和 <end> 的位置,则它是一个正则表达式,表示从第一行与 <funcname> 匹配的 funcname 行开始,直到下一个 funcname 行。:<funcname> 从前一个 -L 范围的末尾开始搜索,如果有的话,否则从文件的开头开始搜索。^:<funcname> 从文件的开头开始搜索。函数名称的确定方式与 git diff 解析补丁块标题的方式相同(请参见 gitattributes(5) 中关于定义自定义块标题的说明)。
以内核主线代码fs/namespace.c文件为例,查看do_new_mount
函数:
git log -L:do_new_mount:fs/namespace.c
我们发现列出的却是do_new_mount_fc
的修改记录,因为do_new_mount_fc
包含字符串do_new_mount
,又在do_new_mount()
函数前面,解决方法是在do_new_mount
后面再加个\(
:
git log -L:do_new_mount\(:fs/namespace.c
在内核开发过程中我们经常需要找某个commit提交记录是哪个版本引入的,使用以下命令
git name-rev <commit>
如果我们有两个github账号,两个账号不能在网站上添加同一个ssh key,这时我们就要再生成一个ssh key,还要将ssh私钥添加到ssh代理:
ssh-keygen -t ed25519-sk -C "YOUR_EMAIL" # 生成新的key
eval "$(ssh-agent -s)" # 启动 SSH 代理
ssh-add ~/.ssh/id_ed25519 # 将 SSH 私钥添加到 SSH 代理
cherry-pick
多个commit
:
git cherry-pick <commit1>..<commitN> # 不包含commit1
如果多个commit中包含有Merge的commit,直接cherry-pick多个会报错error: 提交 xxxx 是一个合并提交但未提供 -m 选项
,可以把git log --oneline
的输出放到文件commits.txt
中,把Merge相关的commit删除,并删除掉每行的后面的commit信息,每行只保留commit号,然后用以下脚本cherry-pick
(各位朋友如果有什么更好的方法请一定要联系告诉我):
# tac 从最后一行开始 cherry-pick
tac commits.txt | while IFS= read -r commit; do
git cherry-pick $commit
if [ $? -eq 0 ]; then
echo "合并成功"
else
echo "合并失败"
return
fi
done
echo "全部合并成功"
git cherry-pick
或git am
合补丁时如果有冲突,在解决完冲突后,在commit
信息中在Conflicts:
后列出冲突文件,如:
Conflicts:
include/linux/sunrpc/clnt.h