引言
NUDT-OS是由国防科技大学操作系统教学团队带领开发的、从零实现的面向X86架构的实验性操作系统,使用Rust开发。NUDT-OS的设计目标是从类UNIX系统出发,吸收学习微内核的设计原则和优点,设计实现一种新型的混合内核架构,以实现系统安全可靠与性能的平衡。同时,探索无栈异步协程等新型技术在OS中的应用。
NUDT-OS采用了一种融合宏内核与微内核特点和优点的融合内核架构。(将在 内核架构中详细说明)。在内核模块中,具有任务管理、内存管理、文件系统、异步管理等模块。支持管道、命令行参数、重定向;支持信号量、互斥锁。下面的表格简要概述了各个模块的功能和特点。
NUDT-OS借助Rust的协程处理机制,采用多对一线程模型,一个协程执行器内核线程服务多个用户线程。类似宏内核,每个进程拥有独立的虚拟地址空间,但借鉴了微内核思想,将一些关键的内核服务运行于内核服务线程,各个内核服务线程保持相对独立,单个内核服务线程崩溃时,系统整体不会崩溃。
项目主要借鉴参考了下面的开源项目:
- rcore-tutorial:rcore-tutorial-v3
模块 | 功能和特点 |
---|---|
任务管理 | 具有进程、内核线程、用户线程三种对象 内核统一调度内核线程和用户线程 采用多对一线程模型,一个协程执行器内核线程服务多个用户线程 支持互斥锁、信号量 |
内存管理 | 每个进程有独立的地址空间 切换进程时切换地址空间 |
文件系统 | 一个简易的文件系统 一切皆文件,将多种对象都抽象为文件 实现管道,命令行参数,重定向 |
异步管理 | 实现异步系统调用 利用协程实现多对一线程模型 |
内核文件结构说明:
kernel/src
├── drivers // 设备驱动
│ ├── ahci.rs
│ ├── mod.rs
│ └── pci.rs
├── fs // 虚拟文件系统抽象
│ ├── inode.rs // 虚拟文件系统的inode
│ ├── mod.rs
│ ├── pipe.rs // 管道
│ └── stdio.rs // 标准输入输出
├── future // 协程处理模块
│ ├── executor.rs // 协程执行器
│ ├── futures // 定义各类协程任务
│ └── mod.rs
├── ipc // 进程间通信的结构
│ └── mod.rs
├── kthread // 内核线程执行的任务或服务
│ ├── executor.rs // 协程执行器线程的任务函数
│ └── mod.rs
├── lib.rs
├── linker.ld // 内核编译链接脚本
├── main.rs // 内核入口
├── mm // 内存管理模块
│ ├── frame_allocator.rs // 内存帧分配器
│ ├── heap_allocator.rs // 内存堆分配器
│ ├── memory_set.rs // 虚拟地址空间抽象
│ ├── mod.rs
│ └── page_table.rs // 页表抽象
├── sync // 互斥同步模块
│ ├── mod.rs
│ ├── mutex.rs // 互斥锁
│ └── sem.rs // 信号量
├── syscall // 系统调用模块
│ ├── fs.rs // 文件相关系统调用
│ ├── mod.rs
│ ├── sync.rs // 同步互斥相关系统调用
│ ├── task.rs // 任务管理相关系统调用
│ ├── uaccess.S // 用户和内核数据交换
│ └── uaccess.rs // 用户和内核数据交换
├── task // 任务管理模块
│ ├── kthread.rs // 内核线程
│ ├── manager.rs // 用户线程管理器
│ ├── mod.rs
│ ├── process.rs // 进程
│ ├── scheduler.rs // 内核统一调度器
│ ├── sleep.rs // 实现阻塞睡眠
│ ├── switch.S // 线程切换
│ └── thread.rs // 用户线程
├── trap // 中断处理模块
│ ├── handler.rs // 中断处理函数
│ ├── mod.rs
│ ├── trap.S // 中断入口
│ └── vector.S // 中断向量
└── utils // 辅助工具
├── console.rs // 实现串口输入输出
├── mod.rs
├── my_x86_64.rs // 一些体系结构相关操作
└── pic.rs // 中断初始化