Skip to content

前言 ​

项目概览 ​

这个项目从“通电 → 引导 → 内核 → 用户态”全链路拆解一套 32 位内核:启动加载代码放在 boot/,核心设施位于 kernel/,驱动与外设抽象集中在 device/。各章直接引用仓库源码,便于在叙述与代码之间对照阅读。

章节导览 ​

每一章都对应开发流水线中的一个里程碑。

  • 第 1 章 部署系统环境:介绍 Linux、Fedora、CLion、GCC、NASM、Bochs、CMake、Git 与 GDB,搭建操作系统开发与调试环境。
  • 第 2 章 内核整体概述:从整体架构出发概览启动流程、内存管理、中断系统、进程、设备、磁盘、文件系统以及系统调用与 Shell。
  • 第 3 章 启动流程详解:从 BIOS、MBR 和 Loader 出发,讲解保护模式切换、分页机制建立、内核加载解析与内核入口初始化。
  • 第 4 章 内存管理:介绍位图、物理与虚拟内存池、页表操作、页分配器、Arena 机制以及 malloc/free 的实现。
  • 第 5 章 中断与异常:讲解 CPU 中断路径、IDT、汇编入口、8259A PIC、TSS 栈切换,以及时钟和键盘中断处理。
  • 第 6 章 进程:记录 PCB、线程与进程创建、调度、上下文切换、同步机制、用户进程和 TSS 的实现过程。
  • 第 7 章 设备与磁盘:梳理控制台、串口、键盘、时钟、I/O 队列、IDE、分区扫描以及设备初始化和文件系统边界。
  • 第 8 章 文件系统:介绍超级块、位图、inode、目录、文件读写、路径解析、系统调用、Shell 与功能测试。
  • 第 9 章 系统调用与进程管理:讲解系统调用机制,以及 fork、exec、wait、exit 等进程管理接口的实现与测试。

环境与工具链 ​

仓库配置为下列版本/依赖:

  • 主机基础:64 位 Linux 环境,并安装 gcc-multilib、nasm 等基础工具。
  • C/C++ 标准:C23 + C++26(由顶层 CMakeLists.txt 的 set(CMAKE_C_STANDARD 23) 与 set(CMAKE_CXX_STANDARD 26) 强制)。
  • 编译器:GCC 15.1.0(含 32 位目标支持,建议以 i386-elf-gcc 或自带 multilib 方式调用)。
  • CMake:4.0.1 及以上;推荐使用 Ninja 生成器,仓库默认构建目录为 cmake-build-debug。
  • Bochs 仿真:可直接执行 bochs -qf bochsrc.disk;如需图形前端或节点版,可按各自安装路径替换命令。
  • 调试:GDB 13+ 可通过 bochsrc-gdb.disk + target remote :1234 连入;串口输出与 Bochs 日志会保存在仓库根目录。

闲言 ​

该OS的代码基本都是一行行手敲的,自己也进行了一些创新,诸如尝试使用现代C++语言(C++23)而不是C语言,使用CMake构建而非MakeFile,目前内核部分基本完善,外层的shell也可以执行用户程序了!

OS为单核32位,利用Bochs做硬件仿真,有boot引导程序; 中断只实现了时钟,键盘,硬盘; 内存分配基于arena,把一个页(4KB)分割为多个2的幂,串在多个代表某2的幂的内存链表上,然后找最满足最优的那个块,如果大于4KB则直接按多少页分配出去; 线程与进程调度使用时间片轮转调度,在一个进程线程队列上,目前基本是先来先服务,但是PCB存在优先级字段,但没有被使用,存在紧急的线程的处理是直接插到队列头,非抢占式; 同步实现了信号量工具,以及互斥量(信号量初值为1的封装); 实现了比C语言的printf更强大的泛型print,保证了类型安全,也实现了很多供内核和用户程序使用的标准库设施; 硬盘采用两块盘,一块裸盘存内核,一块带有文件系统和格式化分区的盘,文件系统基本完善,支持read, write调用读写文件; 支持一个简易的shell,可以使用ls, cd, ps, pwd等简易命令,另外还支持在shell上使用./a执行可执行程序(用户程序),具体方式是,借助宿主机的编辑器编写.cpp代码,借助宿主机的 gcc将代码编译为二进制可执行程序,然后写入到裸盘,在内核里直接读写裸盘读出二进制程序,利用write写到文件系统盘(因为裸盘可以直接读写硬盘,而操作文件系统盘只能用write来保证不破坏硬盘的文件系统),然后就可以在shell上通过ls看到可执行程序,然后去执行了。未来如果可以在内核集成编辑器以及编译器支持,则可以直接在shell中编写代码然后利用编译器编译执行。

这里按目录简单梳理一下仓库结构和各自职责。

  • boot/:引导相关代码与头文件,包含 MBR、Loader 以及进入保护模式前后的早期初始化逻辑。
  • kernel/:内核主体代码:include/ 存放公共头文件,src/ 提供通用基础设施;module/filesystem/ 实现文件系统,module/memory/ 负责物理/虚拟内存管理与分配器,module/thread/ 提供线程、进程与调度框架,module/std/ 实现“标准库”与常用工具,module/shell/ 实现内核 shell 与命令解释,module/program/ 负责用户程序装载与运行时支撑,module/user/ 衔接用户态与系统调用接口;test/ 放置内核内的测试用例。
  • device/:设备抽象与驱动实现:console/ 提供文本控制台与屏幕输出,keyboard/ 处理键盘中断与扫描码解析,time/ 提供时钟中断与节拍计时,ide/ 实现 IDE 硬盘驱动与块设备接口,ioqueue/ 提供设备 I/O 队列与缓冲原语,include/ 则汇总设备相关公共头文件。
  • CMakeLists.txt:顶层构建脚本,统一定义 32 位交叉编译选项、目标布局、磁盘镜像写入规则等。
  • bochsrc.disk:Bochs 仿真配置文件,描述磁盘映像挂载方式与调试端口,其中 bochsrc-gdb.disk 预置了远程 GDB 调试配置。
  • hd64M.img:小容量裸盘镜像,主要用于存放 MBR、Loader 和内核本身,便于直接按 LBA 读写。
  • hd80M.img:带有文件系统与分区布局的磁盘镜像,用来承载用户程序与数据文件,是 shell 看到的“逻辑磁盘”。