引言

NUDT-OS是由国防科技大学操作系统教学团队带领开发的、从零实现的面向X86架构的实验性操作系统,使用Rust开发。NUDT-OS的设计目标是从类UNIX系统出发,吸收学习微内核的设计原则和优点,设计实现一种新型的混合内核架构,以实现系统安全可靠与性能的平衡。同时,探索无栈异步协程等新型技术在OS中的应用。

NUDT-OS采用了一种融合宏内核与微内核特点和优点的融合内核架构。(将在 内核架构中详细说明)。在内核模块中,具有任务管理、内存管理、文件系统、异步管理等模块。支持管道、命令行参数、重定向;支持信号量、互斥锁。下面的表格简要概述了各个模块的功能和特点。

NUDT-OS借助Rust的协程处理机制,采用多对一线程模型,一个协程执行器内核线程服务多个用户线程。类似宏内核,每个进程拥有独立的虚拟地址空间,但借鉴了微内核思想,将一些关键的内核服务运行于内核服务线程,各个内核服务线程保持相对独立,单个内核服务线程崩溃时,系统整体不会崩溃。

项目主要借鉴参考了下面的开源项目:

模块功能和特点
任务管理具有进程、内核线程、用户线程三种对象
内核统一调度内核线程和用户线程
采用多对一线程模型,一个协程执行器内核线程服务多个用户线程
支持互斥锁、信号量
内存管理每个进程有独立的地址空间
切换进程时切换地址空间
文件系统一个简易的文件系统
一切皆文件,将多种对象都抽象为文件
实现管道,命令行参数,重定向
异步管理实现异步系统调用
利用协程实现多对一线程模型

内核文件结构说明:

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                  // 中断初始化