附录C:扩展路线图

完成本教程的15章后,你已经有了一个能运行用户程序的微型操作系统。以下是继续扩展的路线图。


短期项目(1-2周)

1. 简易文件系统

实现一个简单的内存文件系统(ramfs):

目标:
├── 文件创建、读取、写入、删除
├── 目录支持
├── 文件描述符表
└── open/read/write/close 系统调用

关键数据结构:
- superblock(文件系统元信息)
- inode(文件元数据:大小、权限、数据块指针)
- directory entry(文件名 → inode映射)
- 数据块(实际文件内容)

推荐步骤:
1. 在内存中分配固定大小的"磁盘"区域
2. 实现inode分配/释放
3. 实现目录操作(create/lookup/list)
4. 实现文件读写
5. 添加系统调用接口

2. Shell

目标:
├── 命令行解析
├── 内建命令(cd, ls, cat, echo, help, clear)
├── 简单的命令历史
└── 与文件系统集成

推荐实现:
1. 读取键盘输入到行缓冲区
2. 按空格分割命令和参数
3. 查找并执行匹配的命令处理函数
4. 输出结果到屏幕

3. 堆内存管理

替换简单的bump allocator:
├── 实现 malloc/free
├── 空闲链表管理
├── 合并相邻空闲块
├── 分裂大块
└── 对齐支持

推荐算法:
- First Fit(首次适配):简单易实现
- Best Fit(最佳适配):减少碎片
- 伙伴系统(Buddy System):快速合并

中期项目(1-2月)

4. 磁盘文件系统

实现真正的磁盘文件系统:
├── ATA/IDE磁盘驱动(PIO模式)
├── FAT16或ext2文件系统
├── 磁盘分区表解析
└── 文件系统挂载

ATA PIO步骤:
1. 选择驱动器:outb(0x1F6, 0xE0 | drive | head)
2. 设置参数:扇区数、LBA地址
3. 发送命令:outb(0x1F7, 0x20)(读)
4. 等待就绪:轮询状态寄存器
5. 读取数据:insw(0x1F0, buffer, 256)

5. 进程间通信(IPC)

├── 管道(Pipe)
│   ├── 环形缓冲区
│   ├── 读写端文件描述符
│   └── 阻塞/唤醒机制
├── 共享内存
│   ├── 映射相同物理页到不同进程
│   └── 需要同步机制
├── 信号(Signal)
│   ├── 注册信号处理函数
│   └── SIGTERM, SIGKILL等
└── 消息队列

6. 网络栈

├── 网卡驱动(virtio-net或RTL8139)
├── 以太网帧收发
├── ARP协议
├── IP协议
├── ICMP(ping)
├── UDP
├── TCP(简化版)
└── Socket API

推荐顺序:
1. 网卡驱动 → 能收发原始帧
2. 以太网 + ARP → 能解析MAC地址
3. IP + ICMP → 能ping通
4. UDP → 能发送/接收UDP包
5. TCP → 建立连接、可靠传输

长期项目(3-6月)

7. 图形界面

├── VGA图形模式(或VESA/VBE)
├── 帧缓冲区管理
├── 基本图形操作(画点/线/矩形/圆)
├── 字体渲染(位图字体)
├── 窗口管理器
│   ├── 窗口创建/销毁/移动/调整大小
│   ├── Z-order管理
│   └── 事件分发
├── 鼠标驱动
└── GUI工具包(按钮/文本框/菜单)

VBE模式设置:
1. 在实模式下调用BIOS INT 0x10
2. AX=0x4F02, BX=模式号(如0x118=1024x768x24bpp)
3. 保存帧缓冲区物理地址
4. 进入保护模式后映射帧缓冲区

8. 多核支持(SMP)

├── ACPI表解析(找到其他CPU核心)
├── AP(Application Processor)启动
│   ├── 发送INIT IPI
│   ├── 发送STARTUP IPI
│   └── AP从实模式启动,进入保护模式
├── APIC(替代PIC)
│   ├── Local APIC配置
│   └── I/O APIC配置
├── 自旋锁(Spinlock)
├── 每CPU数据结构
└── 负载均衡调度器

9. 64位长模式

├── 修改bootloader进入长模式
│   ├── 启用PAE
│   ├── 设置4级页表(PML4→PDPT→PD→PT)
│   ├── 启用IA-32e模式
│   └── 跳转到64位代码
├── 更新所有汇编代码为64位
├── 更新GDT/IDT
├── 更新系统调用(syscall/sysret替代int 0x80)
└── 更新内存管理(48位/57位虚拟地址)

10. ELF加载器

├── 解析ELF头
│   ├── 验证魔数 0x7f 'E' 'L' 'F'
│   ├── 读取程序头表(Program Header Table)
│   └── 识别PT_LOAD段
├── 加载段到内存
│   ├── 分配虚拟内存页
│   ├── 复制段内容
│   └── 设置权限(读/写/执行)
├── 设置用户栈
└── 跳转到入口点(e_entry)

参考资源

书籍

书籍说明
《Operating Systems: Three Easy Pieces》OS概念经典,免费在线阅读
《Operating System Concepts》(恐龙书)标准教材
《Modern Operating Systems》(Tanenbaum)理论深入
《Linux内核设计与实现》Linux内核入门
《深入理解Linux内核》Linux内核进阶
《Intel® 64 and IA-32 Architectures SDM》x86权威参考

在线教程

资源网址
OSDev Wikiwiki.osdev.org
James Molloy’s Tutorialjamesmolloy.co.uk/tutorial_html
Writing a Simple OS from Scratchnick-blundell.com
The Little OS Booklittleosbook.github.io
Bran’s Kernel Developmentosdever.net/bkerndev
xv6 (MIT教学OS)github.com/mit-pdos/xv6-public
ToaruOSgithub.com/klange/toaruos

开源OS项目(学习参考)

项目特点
xv6MIT教学OS,简洁清晰
Minix 3Tanenbaum设计的微内核
SerenityOS现代C++ OS,带完整GUI
RedoxRust编写的微内核OS
ToaruOS功能丰富的爱好者OS