以一个真实的跨架构内核项目 Avatar Kernel 为载体,讲解操作系统内核的核心机制——包括启动引导、内存管理(MMU、页表、内存分配器)、中断与异常处理、任务调度、系统调用接口、设备驱动框架、文件系统和网络协议栈等。这一单元不要求从零独立编写内核,而是把这套真实代码的设计与实现讲清楚,建立起对 freestanding(无标准库)环境与架构抽象层的整体认知。内核在 AArch64、RISC-V、x86_64 三种架构上实现并持续完善子模块。
实验仓库 https://cnb.cool/opencamp/learning-nccl/Unit-5-C-Kernel
本课程以教学操作系统内核为主线,从零开始逐步实现一个可在 QEMU 上运行、支持多架构的最小操作系统内核。
课程共 24 课,分为 5 个阶段,覆盖裸机启动、内存管理、中断与定时器、多任务、用户态、系统调用和多核调度等核心内容。完成全部课程后,学习者将理解一个现代操作系统内核从启动到运行用户程序的基本流程。
对应 Lesson 97-102。
本阶段从最基础的裸机字符输出开始,逐步完成类型系统、日志系统、链接脚本、引导汇编和架构抽象。
完成后,将拥有一个可以在 AArch64、RISC-V 64 和 x86_64 三个架构上编译,并在 QEMU 中运行的最小内核骨架。
主要内容包括:
· 裸机字符输出
· 独立类型系统
· 内核日志系统
· 链接脚本
· 引导汇编
· 架构抽象层
对应 Lesson 103-108。
本阶段学习内存屏障、自旋锁、物理内存管理、页表结构、MMU 启用和内核地址空间布局。
完成后,内核将具备基础内存管理能力,能够运行在虚拟地址空间中,并为后续任务调度和用户态隔离打下基础。
主要内容包括:
· 内存屏障
· 自旋锁
· 物理内存管理
· 页表结构
· MMU 启用
· 内核地址空间布局
对应 Lesson 109-112。
本阶段实现异常向量表、异常处理、定时器驱动和中断控制器。
完成后,内核可以响应硬件事件,并通过定时器获得周期性“心跳”,为抢占式调度提供基础。
主要内容包括:
· 异常向量表
· 异常处理
· 定时器驱动
· 中断控制器
对应 Lesson 113-116。
本阶段实现任务控制块、上下文切换、轮转调度和抢占式调度。
完成后,内核将具备完整的多任务并发能力,能够在多个任务之间进行调度切换。
主要内容包括:
· 任务控制块
· 上下文切换
· 轮转调度器
· 抢占式调度
对应 Lesson 117-120。
本阶段实现用户态切换、系统调用、ELF 加载和多核启动调度。
完成后,Avatar OS 可以运行用户程序,并支持在多核处理器上并行调度。
主要内容包括:
· 用户态
· 系统调用
· ELF 加载
· 多核启动与调度
对应 Lesson 105。
完成 UART、日志、栈、自旋锁和物理内存管理,形成最小可用的内核基础设施。
对应 Lesson 108。
完成页表、MMU 和地址空间布局,使内核具备虚拟内存管理能力。
对应 Lesson 116。
完成定时器驱动的上下文切换,实现抢占式任务调度。
对应 Lesson 120。
完成用户态、系统调用、ELF 加载和多核支持,形成一个较完整的教学操作系统内核。
课程中的核心机制会在三个架构上实现。
| 架构 | 工具链 | QEMU 运行命令 |
| AArch64 | aarch64-linux-musl-gcc | make ARCH=aarch64 run |
| RISC-V 64 | riscv64-linux-musl-gcc | make ARCH=riscv64 run |
| x86_64 | gcc | make ARCH=x86_64 run |
所有课程使用统一的 kernel/ 构建与运行流程。
所有命令均在仓库根目录执行。
make -C kernel clean
make -C kernel build
make -C kernel qemu
bash grading/grade.sh -l 97
bash grading/grade.sh -l 97,98,99
bash grading/grade.sh
每课 README 中的“预期输出”会描述该课程通过评测时,QEMU 串口输出中需要包含的关键内容。
每课 README 通常包含以下部分:
依据 Avatar OS 固定版本源码整理的核心片段。
如有教学化简化,会在正文中注明适用前提。
解释本课涉及的核心概念、跨架构对比,以及与其他课程之间的关联。
通过苏格拉底式问题,引导学习者思考设计决策背后的原因。
包含测试、扩展和挑战三类任务:
· 测试:验证已有行为是否正确
· 扩展:在现有基础上添加功能
· 挑战:进行更深入的探索或改进
包含架构手册、经典教材和 Avatar OS 源码文件等。
说明自动评测会匹配的关键输出内容。
完成课程中的所有题目,并通过对应的自动评测。
在完成所有题目的基础上,对 avatarkernel 子模块产生实际贡献。
贡献形式可以包括但不限于:
· 修复 avatarkernel 中的问题
· 改进已有内核实现
· 补充或完善测试
· 完善文档说明
· 提交可合并的代码改动