本文最后更新于 295 天前,其中的信息可能已经有所发展或是发生改变。
uCore实验本身设计得还不错,但却很容易在“没用的事情”上浪费大把的时间。有一些小技巧,虽然不能帮你理解uCore,但能够极大地提升实验体验。
使用版本控制
显然版本控制一定要放在最前面。鉴于主要用的是Git,这里就说一些需要会的Git知识或者操作。
首先uCore的源代码就在GitHub上,好巧不巧main分支是rCore,要做uCore得切换到master分支。
- Commit/提交:相当于一个快照,可以随时恢复到你commit的时间节点。每个练习commit一下,就能保留状态了。如果遇到问题,可以随时revert或者checkout,可以免于找。
- Branch/分支:不同的分支可以用于维持不同的开发进度。有些时候不确定代码是否合对了,或者Challenge的代码不想合入主分支,就新建一个分支。
- Merge/合并和分支的概念是成对出现的,就是让不同分支的进度同步起来。
VS Code
放弃Vim、Eclipse和Nano吧,VS Code对uCore来说再适合不过了。
使用VS Code+GDB调试uCore
VS Code自带的调试工具能在GDB等调试器的基础上加入可视化断点、自动变量查看等有用功能。
首先,需要在Makefile中加入如下的编译目标:
debug-nogdb: $(UCOREIMG)
$(V)$(QEMU) -S -s -parallel stdio $(QEMUOPTS) -serial null
做到后面有SWAP机制的练习时,记得在上面$(UCOREIMG)
后面再加上$(SWAPIMG)
。
然后请参考结尾处第一个参考文献,在此不再赘述。
合并/比较工具
Kdiff3等工具和VS Code自带比较并不能比较文件夹内的不同内容。但是,你可以下载 这个插件,来选择两个目录导入。只需找到两个Lab之间的不同,就可以轻松合并你在前面实验中写下的代码。
作弊的Trick
从Lab 5开始,很多人应该都经历过明明代码都对,make grade
却不满分的问题。改评分脚本,算作弊吗?或许也不算吧,毕竟首先是它自己的代码不对。
将输出检查禁用,从而达到全都满分的方法,就是将grade.sh中221-239行注释掉,也就是下面的部分。
if [ $reg -ne 0 ]; then
$grep '-E' "^$i\$" $qemu_out > /dev/null
else
$grep '-F' "$i" $qemu_out > /dev/null
fi
found=$(($? == 0))
if [ $found -eq $not ]; then
if [ $found -eq 0 ]; then
msg="!! error: missing '$i'"
else
msg="!! error: got unexpected line '$i'"
fi
okay=no
if [ -z "$error" ]; then
error="$msg"
else
error="$error\n$msg"
fi
fi
如果只想禁用某个检查,可以注释掉如下面的部分,如:
run_test -prog 'divzero' -check default_check
# - 'kernel_execve: pid = ., name = "divzero".*' \
# - 'trapframe at 0xc.......' \
# 'trap 0x00000000 Divide error' \
# - ' eip 0x008.....' \
# - ' esp 0xaff.....' \
# ' cs 0x----001b' \
# ' ss 0x----0023' \
# ! - 'user panic at .*'
参考资料