第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内核!🎉