您申请加入课程:操作系统原理及课程设计
需要验证您的身份,请输入课程密码:
您的学号:
班级选择:
课程密码:
  • 创建者

    Creator

    李丁丁
  • 活跃度

    Activeness

  • 访问量

    Visits

    95572

教学公告

2021级谭宇亮OS国赛心得
[作者: 李丁丁  发布时间:2025-09-05 14:38:21  浏览次数:63次]


我的国赛心得分享:从兴趣、折腾到获奖

----------

学弟学妹们好!

我是21级的谭宇亮,很高兴丁丁老师给了我一次分享比赛心得(吹牛)的机会,回忆一年前杭电那个难忘的暑假。

----------

一、 兴趣是最好的老师

在上大学之前,我只能用家里老旧性能低下的电子设备,于是折腾 Linux 和 Android 刷机试图给老设备续命,但是遇到很多问题,当时不理解导致没有足够能力解决他们。这些困惑和折腾经历构成了我对操作系统最初的兴趣。

大三上的时候学院开设了操作系统课程,但是对于喜欢折腾的我来说,光听课不动手没有意思。我在网上看到了 MIT 6.s081 课程,感觉挺有意思的,于是选择动手做 6.s081 的实验。大概11月这样,我就已经把课程的实验做完了(部分类似附加题的题目没做),虽然实验很有意思,但我感觉还是不够折腾。

可生命在于折腾啊,我想做些更折腾的东西。

网上说 6.s081 有个进阶一点的课程,但是我感觉经过精心设计的实验不够挑战性,总是差点意思,于是计划自己找点操作系统相关的东西折腾。我决定做一个安卓容器(类似手机上的安卓虚拟机)的兴趣项目,项目大概持续了小半年,容器第一次成功进入桌面的时候特别激动,不过可惜现在烂尾了。但我意识到,自己这样瞎折腾与现实世界比如工业界的开发还是有差别的,我想接触一些更现实世界的东西。

二、 比赛前的选择与自我评估

----------

也是在做这个项目的过程中,和比赛结下了缘分。在搜索前人方案的时候,我搜索到了23年一个安卓虚拟化比赛题目的代码仓库。我一想这比赛很好啊,很有挑战性(够折腾),而且也是接触真实世界问题的一个很好机会。于是盘算着接着他们的题目参加24年的比赛。

但是后面报名的时候没有这个题目。我记得当时浏览了一遍赛题,很多高大上的题目看着有点吓人,看来真实世界的问题还是不太容易的。不过列表里忽然扫到一个题目:《添加 gVisor 的 kvm 和 ptrace 平台对 RISC-V 平台的支持》

ptrace?这不和我的容器项目有些关联(都使用了 ptrace 进行系统调用捕获),相对熟悉;而且比赛题目是做移植,有迹可循。我一想 “稳了”,就选定了这个题目。

细节是魔鬼。 我知道虽然这题目看着不算太难(标的中等难度)和安卓容器有相关的地方,但即使这样也有很多东西要学,很多坑要踩,不太容易;同时当时好不容易找到一份实习,也需要投入时间精力。万一要是我真坚持不住怎么办?

不过好在当时比赛3月开始报名,5月截止。于是不想烂尾的我决定:先不报名,要是我5月份前能够跑通 HelloWorld 的话我就报名,不行的话就趁早放弃。 不报名也没人知道~~(烂尾王就少了一个烂尾项目)~~。

三、 初赛阶段:在“大坑”中学习

----------

初赛的时候主要是跑通编译,繁琐但简单。5月份按照预期跑通了一个 Helloworld,很激动,于是果断报名参赛,起了个队名就叫 HelloWorld。但是,跑通编译仅仅只是开始,挑战才刚刚开始。

第一个遇到的大坑是,为了进度没有弄明白代码为什么这么写,而只是为了跑通编译而瞎填了代码,写了很多 BUG。排除这些 BUG 产生了额外的时间开销,但是幸运的是,问题是清楚的。这过程也学到了很多新知识,因为这也是我喜欢的学习方式:通过动手做点东西,以问题导向的方式学习知识,学习并应用知识解决问题。 这样容易获得正反馈,而且亲自动手验证的知识不容易遗忘。

第二个遇到的大坑是,程序出现了很多并发的奇怪 BUG:

  • 比如说基于 ptrace 追踪的容器里的程序有一些 syscall 会有异常;

  • kvm 虚拟机里程序在多个 vcpu 调度会死锁,单 vcpu 却没问题。

这也是比赛过程最让人抓狂的地方:瞪眼看项目代码怎么都没问题。这时候我想这锅肯定不是我背,但甩锅也得讲求证据,于是我就化身侦探,去调查这些 BUG 产生的真正原因。

可惜我对调试工具~~(放大镜)~~不太熟悉,也尝试了一些调试手段,不过更多的时候还是 “古法查bug”:阅读涉及到的项目和系统内核的相关代码,找出代码路径,在代码路径上一步步手动打印调试日志,二分查找锁定,不断缩小排查范围解决问题。

  • 比如 syscall 通过打印查看追踪前后的寄存器上下文,发现 a0 寄存器内容有问题,不过在 LKML 上发现有相关的 patch,幸运地是问题很快解决了,不幸地是痛失捡漏一个向 Linux kernel 提交 patch 的机会哈哈哈。

  • 通过打印内核里 vcpu 调度的代码路径,最终发现是因为 kvm 遵循 opensbi 规范默认设置 vcpu 休眠,导致调度到休眠的 vcpu 一直等待唤醒而呈现死锁的状态。

虽然解决 bug 很费时间(一个多月),并且不知道 bug 是什么原因的时候很抓狂,但是我始终相信问题的产生是有原因的,找出产生问题的真正原因然后解决他就行。 这些拦路虎 bug 被我干掉之后,我的比赛也有了不少信心。

四、 决赛阶段:临门一脚与答辩技巧

----------

比赛决赛阶段是整个比赛过程画龙点睛的一个重要阶段,核心是展示和检验初赛阶段的工作成果和对比赛项目的进一步打磨~~(内卷)~~。

在决赛代码提交之前,丁丁老师建议我应该跑一下项目自带的单元测试。结果我第一次跑下来才不过 六成的通过率,修了两三天也才不过八成,想着准备放弃了。但是我想着不能烂尾,也许就差这临门一脚了。幸运的是,经过排查找出了很多问题,在决赛代码提交之前通过率去到了 97%

丁丁老师在最终的线下答辩和 PPT 方面给了我很多重要的指导:答辩抓住重点,吸引评委老师,展现工作量并且讲清技术难点的同时,不过于深入技术细节和展示“创新点”。

线下答辩之后自我感觉还不错,而且因为准备充分,老师的提问也基本接住了。我觉得这是我的比赛项目虽然在技术难度和创新上相对薄弱,但最终在比赛能够获奖的重要原因之一吧。

五、 比赛之后

----------

比赛心得写于比赛一年之后,我这一年经历了很多问题和挑战:被现实毒打的秋招,繁琐的毕业设计和当下工作的挑战等等。

但是我相信这些问题和挑战总会有解决的办法,就像那次比赛一样。

我想,这可能是比赛给我带来的最大的收获吧。


相关课程

扫一扫二维码,快速加入本课程!

放大二维码 查看使用方法
关闭