欢迎来到 Stage 21。在这一阶段,我们将实现操作系统的核心功能之一:进程管理。这标志着我们的内核从单线程执行向多任务系统的重大跨越。
通过这个教程系列,你将学会:
- 如何设计进程控制块(PCB)数据结构
- 如何实现进程调度器
- 如何用汇编实现上下文切换
- 如何实现 fork、exit、wait4 等经典系统调用
- 如何支持线程管理
- 如何实现可扩展的调度类框架
开始之前,请确保你已经完成了:
- Stage 20: 系统调用框架
- 理解 x86_64 汇编基础
- 理解虚拟内存管理(VMM)
- 熟悉 System V AMD64 ABI 调用约定
操作系统: Ubuntu 22.04 LTS / WSL2 / Arch WSL
编译器: x86_64-elf-gcc 或类似交叉编译器
构建工具: CMake 3.25 或更高版本
模拟器: QEMU 7.0 或更高版本
汇编器: NASM 2.15 或更高版本
本教程包含以下章节,建议按顺序阅读:
-
01 - 为什么需要进程管理 从单线程到多进程的演进,理解进程管理的必要性
-
02 - 进程管理设计基础 进程状态机、调度算法选择、PCB 结构设计
-
03 - 创建进程管理脚手架 搭建目录结构、配置构建系统、定义头文件
-
04 - 实现PID分配器 基于 Bitmap 的 PID 分配器实现
-
05 - 实现进程控制块管理 PCB 的分配、释放和查找
-
06 - 实现调度器框架 可扩展的调度类框架和 Round-Robin 实现
-
07 - 实现上下文切换汇编 汇编实现的上下文切换,TSS 和 CR3 管理
-
08 - 实现fork系统调用 进程创建、地址空间管理、父子关系建立
-
09 - 实现exit和wait4 进程退出、僵尸进程处理、进程回收
-
10 - 实现线程管理 内核线程和用户线程的创建与管理
-
11 - 编写进程演示程序 使用演示程序验证所有功能
-
12 - 系统调用集成与测试 注册系统调用、编写用户态测试
完成本阶段后,你的内核将具备:
-
进程控制块(PCB)管理
- 进程标识(PID、PPID)
- 进程状态(READY、RUNNING、BLOCKED、ZOMBIE)
- 进程树管理(父子关系、兄弟关系)
-
进程调度器
- 可扩展的调度类框架
- Round-Robin 调度算法
- 优先级调度算法(可选)
-
上下文切换
- 汇编实现的高效切换
- 地址空间切换(CR3)
- TSS 内核栈管理
-
内存隔离
- 每进程独立地址空间
- 用户空间创建/销毁
-
系统调用
- fork() - 创建进程
- exit() - 退出进程
- wait4() - 等待子进程
- getpid() / getppid() - 获取进程 ID
-
线程支持
- 内核线程创建
- 用户线程创建
- 线程 join/detach
如果你想直接看到结果,可以跳到最后一章:
# 编译内核
cd /home/charliechen/CCOperatingSystemX64
cmake -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build
# 运行演示
qemu-system-x86_64 -kernel build/kernel.bin -serial stdio作者: CharlieChen114514 最后更新: 2026-02-20