一些让 uCore 更轻松的小技巧

uCore 实验本身设计得还不错,但却很容易在 “没用的事情” 上浪费大把的时间。有一些小技巧,虽然不能帮你理解 uCore,但能够极大地提升实验体验。

使用版本控制

显然版本控制一定要放在最前面。鉴于主要用的是 Git,这里就说一些需要会的 Git 知识或者操作。

首先 uCore 的源代码就在 GitHub 上,好巧不巧 main 分支是 rCore,要做 uCore 得切换到 master 分支。

GitHub

chyyuu/os_kernel_lab

  • Commit / 提交:相当于一个快照,可以随时恢复到你 commit 的时间节点。每个练习 commit 一下,就能保留状态了。如果遇到问题,可以随时 revert 或者 checkout,可以免于找。
  • Branch / 分支:不同的分支可以用于维持不同的开发进度。有些时候不确定代码是否合对了,或者 Challenge 的代码不想合入主分支,就新建一个分支。
  • Merge / 合并和分支的概念是成对出现的,就是让不同分支的进度同步起来。

VS Code

放弃 Vim、Eclipse 和 Nano 吧,VS Code 对 uCore 来说再适合不过了。

使用 VS Code+GDB 调试 uCore

VS Code 自带的调试工具能在 GDB 等调试器的基础上加入可视化断点、自动变量查看等有用功能。

首先,需要在 Makefile 中加入如下的编译目标:

makefile
1
2
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 行注释掉,也就是下面的部分。

sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
            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

如果只想禁用某个检查,可以注释掉如下面的部分,如:

sh
1
2
3
4
5
6
7
8
9
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 .*'

参考资料