第15章:用户程序
本章概述
这是我们OS开发之旅的最后一章!我们将实现特权级切换和系统调用,让用户代码在Ring 3中安全运行,通过系统调用访问内核服务。
学习目标
- 理解x86的特权级机制(Ring 0-3)
- 配置TSS(任务状态段)
- 实现系统调用机制(INT 0x80)
- 加载并运行用户态代码
- 完成一个完整的OS内核!
前置知识
- GDT和段选择子(第5章)
- 中断处理(第9章)
- 进程管理和调度(第13-14章)
知识要点
特权级环
┌────────────────────┐
│ Ring 0 │ 内核代码/数据
│ ┌──────────────┐ │
│ │ Ring 1/2 │ │ 设备驱动(通常不用)
│ │ ┌──────────┐ │ │
│ │ │ Ring 3 │ │ │ 用户程序
│ │ └──────────┘ │ │
│ └──────────────┘ │
└────────────────────┘
系统调用流程
用户程序 (Ring 3) │ 内核 (Ring 0)
│
mov eax, SYS_WRITE │
mov ebx, ..." │
int 0x80 ────────────┼──→ syscall_handler()
│ ↓ 查找系统调用表
│ ↓ 执行内核函数
iret ←───────────────┼──── 返回结果
│
文件结构
15-用户程序/
├── README.md
├── 理论讲解.md
├── code/
│ ├── tss.h ← TSS数据结构
│ ├── tss.c ← TSS配置
│ ├── syscall.h ← 系统调用定义
│ ├── syscall.c ← 系统调用处理
│ ├── usermode.h ← 用户模式切换
│ ├── usermode.c ← 进入Ring 3
│ ├── user_program.c ← 一个简单的用户程序
│ ├── kernel.c
│ ├── Makefile
│ └── [共享文件]
├── 常见错误.md
├── 练习题.md
└── 总结与展望.md
构建与测试
cd code
make
make run
# 应该能看到用户程序通过系统调用输出文本!本章收获
- ✅ 理解Ring 0/Ring 3特权级切换
- ✅ TSS配置与使用
- ✅ 系统调用机制实现
- ✅ 用户態程序运行
- ✅ 完成一个具备核心功能的OS内核!🎉