Linux内核开发环境-代码管理和编辑工具

建议点击这里查看个人主页上的最新原文

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

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

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

下面介绍Linux内核编译环境和测试环境的搭建过程,当然我也为各位朋友准备好了已经安装好的虚拟机镜像,只需下载运行即可。

点击这里从百度网盘下载对应平台的虚拟机镜像x86_64(也就是你平时用来安装windows系统的电脑,或者2020年前的苹果电脑)选择ubuntu-x64_64.ziparm64(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:88888888${HOME}/.config/code-server/config.yaml配置文件中配置的端口)。

有些格式的文件可能不会自动换行显示,可以勾选View -> Word Wrap

注意,和vscode客户端不一样,vscode server装插件时有些插件无法搜索到,这时就需要在vscode网站上下载.vsix文件,手动安装。

常用插件:

当想在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-pickgit am合补丁时如果有冲突,在解决完冲突后,在commit信息中在Conflicts:后列出冲突文件,如:

Conflicts:
        include/linux/sunrpc/clnt.h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值