香港操作系统内核课程内容与编程要求
操作系统内核(Operating System Internals)是计算机科学硕士(MPhil/PhD)与部分授课型硕士(MSc)的硬核必修或选修方向。在香港高校里,这门课通常以”原理 + 编码”双轨推进——既要讲清楚进程调度、虚拟内存、文件系统、同步原语、I/O 子系统、虚拟化等模块的内部机理,也要让学生在真实内核或内核级模拟器上写代码。对内地读者来说,最常见的疑问不是”难不难”,而是”到底要写什么、用什么语言、要交哪些作业”。本文以香港主要高校(以港大、中科大(广州)、港中文、港科大、港城大、港理工等的公开大纲为参考)为例,梳理这门课的典型内容与编程要求,方便你提前判断是否适合自己。
各校每年大纲可能微调,建议以你意向院校最新课程手册为准。
一、课程定位与教学目标
这门课在港校通常名为 Advanced Operating Systems、Operating System Kernel、Systems Programming 或 OS Implementation,定位有三种典型:
- 进阶理论型:偏重内核机制讲解,作业以分析、设计为主,编程量中等;
- 实战内核型:以 xv6、OS161、NACHOS、JOS、rCore(内地常用)或自研教学内核为载体,强制学生补完内核模块;
- 系统编程型:围绕 Linux 系统调用、驱动框架、文件系统、网络栈做工程型项目,编程量较大。
无论哪种,授课目标都是一致的:让学生”看懂内核源码 + 能动手改内核代码”。考核一般包含期中/期末考试 + 实验作业 + 期末项目三部分,权重以实验为主(通常占总评 50%–70%)。
二、核心教学内容六大模块
1. 进程与线程管理
- 进程控制块(PCB/Task Struct)、上下文切换、内核栈
- 调度算法:CFS、MLFQ、O(1)、实时调度(Rate-Monotonic、EDF)
- 进程间通信:信号、管道、共享内存、消息队列
- 线程模型:用户线程、内核线程、Pthreads、协程对比
2. 同步与并发
- 锁原语:互斥锁、自旋锁、读写锁、顺序锁、RCU
- 无锁编程:CAS、atomic、内存屏障
- 经典同步问题:生产者–消费者、读者–写者、哲学家就餐
- 内核同步的特殊性:关中断、per-CPU 变量、seqlock
3. 内存管理
- 物理内存分配:伙伴系统、SLAB/SLUB
- 虚拟内存:分页机制、多级页表、TLB、反向映射
- 缺页处理、COW、内存回收(kswapd)、OOM
- 大页(HugePage)、NUMA 感知、内存压缩
4. 文件系统与 I/O
- VFS 抽象层:inode、dentry、file 对象
- 主流实现:ext4、xfs、btrfs、FAT/NTFS 兼容层
- 日志机制(journaling)、写回策略、文件系统一致性
- 块设备调度、I/O 调度器(BFQ/mq-deadline)、页缓存
5. 中断、异常与系统调用
- 中断向量表、IRQ 子系统、上半部/下半部、tasklet、workqueue
- 系统调用接口:参数传递约定(x86_64 RISC-V64)、glibc 封装
- eBPF 与内核探针(较新内容,常作为延伸)
6. 虚拟化、安全与容器
- CPU 虚拟化:VT-x/SVM、影子页表、EPT/NPT
- KVM/QEMU 架构、半虚拟化(virtio)
- 容器底层:cgroup、namespace、seccomp
- 内核安全:Capability、LSM(SELinux/AppArmor)、KASLR
部分课程还会把网络栈(TCP/IP 在内核中的实现、Netfilter)与性能分析工具(perf、ftrace、SystemTap)单列章节,作为期末项目素材。
三、典型实验作业长什么样
港校的 OS 内核课作业有较强的”传承性”,多数沿用以下经典项目:
1. 教学内核二次开发(最常见)
- xv6(MIT 经典):RISC-V 或 x86 版本,几乎是港校标配。学生需实现系统调用、调度器、内存管理、文件系统等模块。
- OS161:加拿大 UBC 起家,模拟 MIPS,教学风格更细致,适合引导零基础。
- rCore / Rust 训练营项目:部分港校近年引入 Rust 重写版本,强调内存安全。
2. 系统编程小项目
- 实现一个
ls、cat、grep、find的 mini 版(熟悉 syscall) - 写一个多线程 HTTP 服务器或回显代理(熟悉 socket + 线程池)
- 用 eBPF 写一个进程/网络监控工具
3. 期末大项目(Capstone)
- 为教学内核新增一个文件系统(如日志文件系统)
- 实现一个简单的进程调度器,并在真实负载下评测
- 写一个 FUSE 用户态文件系统
- 在树莓派或 QEMU 上移植 Linux 到某新型硬件平台
作业评分通常看正确性 + 通过测试集 + 代码可读性 + 实验报告四部分。实验报告常要求说明:你的设计权衡、为什么这样实现、用了哪些性能工具验证。
四、编程语言与工具门槛
这是内地同学最关心的”上手问题”,直接说结论:
| 维度 | 主流要求 |
|---|---|
| 核心语言 | C(必需,占 80% 以上代码量) |
| 汇编语言 | x86-64 或 RISC-V 汇编(必修,理解上下文切换与中断) |
| 可选语言 | Rust(少数新派课程)、Python(评测脚本)、Shell(构建脚本) |
| 构建工具 | Makefile、CMake、gcc/clang 交叉编译链 |
| 调试工具 | GDB、QEMU monitor、strace、perf、ftrace |
| 版本控制 | Git(强制) |
| 实验平台 | QEMU 模拟器 + Linux 主机环境,部分课程提供云端实验台 |
C 语言要掌握到什么程度?
不是”会写排序和链表”就行,而是要理解:
- 指针、函数指针、
volatile、restrict、_Atomic的语义 - 头文件依赖、预处理宏、链接顺序
- 手动内存管理、内存对齐、cache line 友好写法
- 内核编码风格:不用 libc、内联函数慎用、注释密度高
汇编要掌握到什么程度?
- 能读懂上下文切换的核心几条指令(保存/恢复通用寄存器、切换栈指针)
- 能理解系统调用入口与中断返回机制
- 能写数十行的简单汇编片段(如 context switch stub)
推荐的内地前置训练
- 读完《Operating Systems: Three Easy Pieces》(免费,可视化极佳)
- 完成 CSAPP《深入理解计算机系统》第三版 7–10 章实验
- 跑过一遍 MIT 6.S081(xv6 labs)的 lab 0–4(GitHub 公开)
- 用 QEMU 启动过 Linux/RTOS 镜像
- 有条件再补一段《Linux Kernel Development》(Robert Love)阅读笔记
五、考核方式与分数构成(以典型校为例)
| 组成部分 | 占比参考 | 形式 |
|---|---|---|
| 平时实验 | 40%–60% | 4–6 个 lab,按周布置 |
| 期末项目 | 20%–35% | 2–4 人组队,提交代码 + 报告 + 演示 |
| 期中考试 | 10%–20% | 闭卷,理论 + 小段代码阅读 |
| 期末考试 | 0%–30% | 部分课程以项目替代考试 |
| 课堂参与 | 5%–10% | Office hour、讨论区答疑 |
港校普遍采用绝对评分尺度(A/A-/B+/…),不像英美体系按曲线砍人。这意味着只要你代码能跑通、报告写清楚,拿到 B+ 以上并不算难;但若卡在某个 lab 进度滞后,拖到期末会非常被动。
六、选课与学习节奏建议
- 先看大纲里的”前置课程”。操作系统、数据结构、计算机组成原理、计算机网络是常见门槛。缺哪门课,需要在开学前自补。
- 提前搭好实验环境。QEMU + RISC-V 工具链是 xv6 主流;OS161 多用 MIPS 工具链。建议在大纲发布当天就把工具链装好。
- 找搭档而不是搭便车。港校实验通常允许 2 人合作,组队前可在课程 Slack/微信群提前接触。
- 每周固定 Office Hour 时间。授课型 TA 一般每周 2 次答疑,提前整理问题效率最高。
- 不要把 lab 拖到最后一周。内核代码一旦写崩,调试时间以天计;尤其涉及并发与内存的部分,几乎无法”赶出来”。
- 做好版本管理。每周一个 tag,期末项目分手时不会乱。
- 英文报告先用中文草稿。术语可参考 OS Three Easy Pieces 与《Operating System Concepts》(恐龙书)的中英对照表。
七、对内地申请者的常见提醒
- 语言要求:授课型硕士一般要求雅思 6.5 或同等托福分数;研究型硕博需套磁导师后再选课。
- 学籍与签证:全日制学生持学生签证可在港修读;部分高校允许 Part-time 注册,但 OS 实验量大,全日制更稳妥。
- 硬件设备:自带 16GB 以上内存的笔记本;M 系列 Mac 需要跑 x86 镜像时建议配一个 Linux 云实验台。
- 学术诚信:港校对抄袭、代码搬运(即便来自 GitHub)、明示身份分享答案的处理非常严格,开学前会要求签署学术诚信声明。
- 转专业可行性:本科非 CS 但有较强编程与系统背景者,部分课程允许先修背景课再上内核课,建议邮件询问系里。
结语
操作系统内核课在港校更像一门”工程写作课”——你要把论文里的算法、教材里的机制,翻译成能在 QEMU 上跑起来的 C/汇编代码。课程内容并不神秘:C 是骨架、汇编是关节、并发与内存管理是肌肉、文件系统与设备是皮肤;真正决定成绩的是每周的实验节奏与对工具链的熟悉度。
如果你正在评估”是否值得为一门课专程来港”,或者想了解香港高校的师资方向、奖学金制度、生活成本与申请时间线,可以到 香港大全 查看更多香港相关指南,里面整理了从入学申请到抵港生活的全流程资料。
常见问答
香港操作系统内核课到底要写什么代码?必须改真实内核吗?
课程通常以教学内核(xv6、OS161、NACHOS、JOS、rCore 等)为载体,学生在这些内核上补完系统调用、调度器、内存管理、文件系统等模块,而非直接改 Linux 上游内核。也有部分课程走”系统编程”路线,围绕 Linux 系统调用、文件系统、网络栈做工程型项目,具体形式因校而异,以你意向院校最新课程手册为准。
这门课对 C 语言的要求有多高?只会做链表题够不够?
远远不够。文章明确指出,C 是必需语言,占代码量 80% 以上,需要熟悉 volatile、restrict、_Atomic 等语义、手动内存管理、内存对齐、内核编码风格(不用 libc、注释密度高等)。指针、函数指针、头文件依赖、链接顺序都是基础门槛,建议开学前按 CSAPP 第 7–10 章实验自补。
汇编语言要学到什么程度?完全没接触过怎么办?
需要能理解 x86-64 或 RISC-V 汇编层面的上下文切换、系统调用入口与中断返回机制,并能用汇编写出简单的 context switch stub 等片段。文章推荐的入门路径是先读完《Operating Systems: Three Easy Pieces》并跑通 MIT 6.S081 的 lab 0–4,再视进度补《Linux Kernel Development》阅读笔记。
平时实验、期末项目、考试分别占多少分?哪个最容易挂?
按文章整理,平时实验一般占 40%–60%、期末项目 20%–35%、期中考试 10%–20%、期末考试 0%–30%、课堂参与 5%–10%,实验权重最高。港校采用绝对评分尺度(A/A-/B+/…),不按曲线砍人,所以代码能跑通、报告写清楚,拿到 B+ 以上并不算难;但若某个 lab 进度滞后拖到期末,并发与内存相关模块几乎无法”赶出来”,是常见挂科点。
本科不是 CS 专业,能直接选这门课吗?
有可能,但需要看具体院校政策。文章提到,本科非 CS 但有较强编程与系统背景者,部分课程允许先修背景课再上内核课;建议在选课前直接邮件询问目标院系,并提前评估自己是否补齐操作系统、数据结构、计算机组成原理、计算机网络这几门常见前置课。
港校 OS 内核课允许组队吗?组队有什么坑要避?
多数港校实验允许 2 人合作,期末 Capstone 通常 2–4 人组队,提交代码 + 报告 + 演示。文章提醒”找搭档而不是搭便车”,建议在课程 Slack/微信群提前接触彼此,并做好每周一个 tag 的版本管理,避免期末分手时仓库混乱;同时注意港校对抄袭、代码搬运(包括 GitHub 公开仓库)的处理非常严格,开学前需签署学术诚信声明。