Appearance
前言
项目概览
这个项目从“通电 → 引导 → 内核 → 用户态”全链路拆解一套 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 看到的“逻辑磁盘”。