武汉大学计算机学院操作系统实践A课程设计项目
本项目是武汉大学操作系统实践课程的课程设计成果,实现了一个基于 RISC-V 架构的简化操作系统内核。项目参考经典教学操作系统 xv6-riscv,从零开始构建,涵盖了现代操作系统的核心功能模块,包括系统启动、内存管理、进程调度、系统调用和文件系统等。
- 课程名称: 操作系统实践A
- 开发平台: Ubuntu 22.04 LTS (VirtualBox)
- 目标架构: RISC-V 64-bit
- 参考项目: xv6-riscv
WHU_RISCV_OS_LAB/
├── LAB_Code/ # 操作系统源代码
│ ├── kernel/ # 内核源码
│ │ ├── boot/ # 启动代码 (entry.S, start.c, kernel.ld)
│ │ ├── mm/ # 内存管理 (pmm.c, vm.c)
│ │ ├── trap/ # 中断/异常处理 (trap.c, timer.c, trampoline.S)
│ │ ├── proc/ # 进程管理 (scheduler.c, sched.c, context.c, sync.c)
│ │ ├── syscall/ # 系统调用 (syscall.c)
│ │ ├── fs/ # 文件系统 (fs.c, file.c, log.c, bio.c)
│ │ ├── platform/ # 平台驱动 (virtio_disk.c)
│ │ ├── main.c # 内核入口
│ │ ├── printf.c # 格式化输出
│ │ ├── uart.c # 串口驱动
│ │ └── spinlock.c # 自旋锁
│ ├── user/ # 用户态程序
│ │ ├── entry.S # 用户程序入口
│ │ ├── usys.S # 系统调用存根
│ │ ├── syslib.c # 用户态库函数
│ │ └── fs_tests.c # 文件系统测试程序
│ ├── include/ # 头文件
│ ├── build/ # 编译产物
│ └── Makefile # 构建脚本
├── LAB_Report/ # 实验报告
│ ├── LAB01/ # 实验1:RISC-V引导与裸机启动
│ ├── LAB02/ # 实验2:内核printf与清屏功能实现
│ ├── LAB03/ # 实验3:页表与内存管理
│ ├── LAB04/ # 实验4:中断处理与时钟管理
│ ├── LAB05/ # 实验5:进程管理与调度
│ ├── LAB06/ # 实验6:系统调用实现
│ ├── LAB07/ # 实验7:文件系统
│ ├── LAB08_Extra/ # 实验8:优先级调度系统(扩展)
│ ├── OS_OutputImage/ # 运行截图
│ └── Summary/ # 课程总结报告
└── 课程总结报告.pdf # 最终总结报告
本操作系统采用分层架构设计,自下而上包含以下核心模块:
- UART驱动: 串口字符输入输出,支持格式化打印
- VirtIO磁盘驱动: QEMU虚拟磁盘设备驱动,支持块读写操作
- SBI接口: 通过RISC-V SBI调用访问机器模式服务(定时器中断)
- entry.S: 汇编启动代码,初始化栈指针,清零BSS段
- start.c: 机器模式初始化,配置PMP、中断委托,切换至监管者模式
- kernel.ld: 链接脚本,定义内核内存布局(0x80000000起始地址)
- 物理内存管理器 (PMM): 基于空闲链表的物理页分配器,支持按页(4KB)分配和回收
- 虚拟内存管理器 (VMM): 基于RISC-V Sv39三级页表的虚拟地址翻译,支持内核和用户地址空间隔离
- 页表管理: 实现页表遍历、映射、取消映射和页表销毁
- 中断向量表: 内核态中断向量(trapvec.S)和用户态陷入向量(trampoline.S)
- 异常分发器: 统一的trap处理框架,支持系统调用、页错误、定时器中断等
- 时钟管理: 基于RISC-V Timer扩展的周期性时钟中断,驱动进程调度
- 进程控制块 (PCB): 包含PID、状态、页表、内核栈、trapframe等信息
- 调度器: 支持轮转调度(Round-Robin)和优先级调度(Priority Scheduling with Aging)
- 上下文切换: 基于RISC-V callee-saved寄存器的轻量级上下文切换(swtch.S)
- 同步原语: 自旋锁、睡眠锁、信号量、条件变量、屏障
实现的系统调用包括:
- 进程管理:
fork(),exit(),wait(),kill(),getpid() - 文件操作:
open(),read(),write(),close(),unlink() - 其他:
sbrk(),sleep(),uptime()
- 磁盘布局: 包含超级块、日志区、inode区、位图区和数据区
- 日志系统: 基于Write-Ahead Logging的崩溃一致性保证
- inode层: 文件元数据管理,支持常规文件和目录
- 块缓存: LRU缓存策略,减少磁盘I/O次数
- 目录管理: 支持目录查找、文件创建和删除
虚拟地址空间布局 (Sv39):
0x0000000000000000 - 0x0000003FFFFFFFFF : 用户地址空间 (256GB)
0x0000004000000000 - 0xFFFFFFBFFFFFFFFF : 保留
0xFFFFFFC000000000 - 0xFFFFFFFFFFFFFFFF : 内核地址空间 (256GB)
内核物理内存布局:
0x80000000 : 内核代码段 (.text)
0x80xxxxxx : 内核数据段 (.data, .bss)
0x80xxxxxx - 0x88000000 : 可用物理内存(约128MB)
- 操作系统: Ubuntu 22.04 LTS 或兼容发行版
- 交叉编译器: riscv64-unknown-elf-gcc (推荐版本 12.2.0+)
- 模拟器: QEMU 7.2.0+ (qemu-system-riscv64)
- 构建工具: GNU Make, Python3
- 调试工具: gdb-multiarch (可选)
cd LAB_Code
makemake qemu# 终端1:启动QEMU等待调试器连接
make qemu-gdb
# 终端2:启动GDB
riscv64-unknown-elf-gdb kernel/kernel.elf
(gdb) target remote localhost:26000
(gdb) b main
(gdb) cmake clean- 支持基于Sv39的三级分页机制
- 实现了用户态和内核态的完全隔离
- 支持抢占式多任务调度
- 提供完整的系统调用接口
- 实现了崩溃一致性的日志文件系统
- 支持优先级调度与防饥饿机制
- 提供了丰富的同步原语
本项目仅供课程学习和研究使用。