Skip to content

Ea1XonCodeHou/WHU_RISCV_OS_LAB

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 

Repository files navigation

WHU RISC-V OS Lab

武汉大学计算机学院操作系统实践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       # 最终总结报告

操作系统架构

系统组成

本操作系统采用分层架构设计,自下而上包含以下核心模块:

1. 硬件抽象层

  • UART驱动: 串口字符输入输出,支持格式化打印
  • VirtIO磁盘驱动: QEMU虚拟磁盘设备驱动,支持块读写操作
  • SBI接口: 通过RISC-V SBI调用访问机器模式服务(定时器中断)

2. 系统启动模块

  • entry.S: 汇编启动代码,初始化栈指针,清零BSS段
  • start.c: 机器模式初始化,配置PMP、中断委托,切换至监管者模式
  • kernel.ld: 链接脚本,定义内核内存布局(0x80000000起始地址)

3. 内存管理子系统

  • 物理内存管理器 (PMM): 基于空闲链表的物理页分配器,支持按页(4KB)分配和回收
  • 虚拟内存管理器 (VMM): 基于RISC-V Sv39三级页表的虚拟地址翻译,支持内核和用户地址空间隔离
  • 页表管理: 实现页表遍历、映射、取消映射和页表销毁

4. 中断与异常处理

  • 中断向量表: 内核态中断向量(trapvec.S)和用户态陷入向量(trampoline.S)
  • 异常分发器: 统一的trap处理框架,支持系统调用、页错误、定时器中断等
  • 时钟管理: 基于RISC-V Timer扩展的周期性时钟中断,驱动进程调度

5. 进程管理与调度

  • 进程控制块 (PCB): 包含PID、状态、页表、内核栈、trapframe等信息
  • 调度器: 支持轮转调度(Round-Robin)和优先级调度(Priority Scheduling with Aging)
  • 上下文切换: 基于RISC-V callee-saved寄存器的轻量级上下文切换(swtch.S)
  • 同步原语: 自旋锁、睡眠锁、信号量、条件变量、屏障

6. 系统调用接口

实现的系统调用包括:

  • 进程管理: fork(), exit(), wait(), kill(), getpid()
  • 文件操作: open(), read(), write(), close(), unlink()
  • 其他: sbrk(), sleep(), uptime()

7. 文件系统

  • 磁盘布局: 包含超级块、日志区、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
make

运行系统

make qemu

调试模式

# 终端1:启动QEMU等待调试器连接
make qemu-gdb

# 终端2:启动GDB
riscv64-unknown-elf-gdb kernel/kernel.elf
(gdb) target remote localhost:26000
(gdb) b main
(gdb) c

清理构建产物

make clean

技术特性

  • 支持基于Sv39的三级分页机制
  • 实现了用户态和内核态的完全隔离
  • 支持抢占式多任务调度
  • 提供完整的系统调用接口
  • 实现了崩溃一致性的日志文件系统
  • 支持优先级调度与防饥饿机制
  • 提供了丰富的同步原语

参考资料

许可证

本项目仅供课程学习和研究使用。


个人源码仓库: https://github.com/Ea1XonCodeHou/WHU_RISCV_OS_LAB

About

本仓库用于存储武汉大学计算机学院操作系统实践A课程项目作业代码

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors