引言
设计目标
NUDT-OS的设计目标是探索不同的内核架构对于内核性能与安全可靠性的影响,并尝试设计一种架构来平衡二者。
一般来说,将所有内核功能都集成在内核态的宏内核具有很好的性能,但是安全性和稳定性较差,内核中任何一个模块出现故障(一般为低质量的驱动代码)都会导致内核崩溃。微内核为了解决这个问题,将非核心的内核服务移动到用户态以独立的用户进程提供,但这也带来了频繁的进程间通信开销导致的性能问题。关于宏内核与微内核的更具体的讨论,可以参考内核架构一节。
NUDT-OS为了综合宏内核和微内核的优点,权衡内核性能与可靠性,做了一些初步的尝试,具体来说:
-
NUDT-OS采用了一种融合宏内核与微内核特点和优点的融合内核架构。(在 内核架构中详细说明)
-
所有的内核服务都运行在内核态,但借鉴了微内核思想,将一些非核心的内核服务(如文件系统、部分设备驱动)运行于内核服务线程,各个内核服务线程保持相对独立,单个内核服务线程崩溃时,系统整体不会崩溃。(在内核服务线程中详细介绍)
-
借助Rust的无栈异步协程,实现多对多线程模型,一个协程执行器内核线程服务多个用户线程(执行调度)。而其他多个内核线程完成具体的服务。(具体参见异步管理)
完成情况
在内核中,具有任务管理、内存管理、文件系统、异步管理等模块。支持管道、命令行参数、重定向;支持信号量、互斥锁、条件变量等。下面的表格简要概述了各个模块的功能和特点。
模块 | 功能和特点 |
---|---|
任务管理 | 进程、内核线程、用户线程三种对象 内核统一调度内核线程和用户线程 采用 多对多线程模型 ,一个协程执行器内核线程服务多个用户线程 |
内存管理 | 每个进程有独立的地址空间 切换进程时切换地址空间 所有 用户线程共享内核栈 |
文件系统 | 一个简易的文件系统 一切皆文件,将多种对象都抽象为文件 实现管道,命令行参数,重定向 |
同步互斥 | 支持互斥锁、信号量、条件变量 |
设备驱动 | (使用了rcore开源库)目前支持ahci磁盘驱动、pci总线驱动、串口 |
异步管理 | 利用协程实现多个异步系统调用 利用协程实现多对多线程模型 |
内核服务线程 | 每个内核服务线程执行一种特定服务 用户通过系统调用向内核服务线程发送请求并获得服务 内核服务线程崩溃时系统保持稳定,并可以 重启恢复内核线程 |
目前内核提供了一组基础的系统调用,我们仍在继续添加更多的驱动程序支持与系统调用:
- 任务管理类:
- fork:复制当前进程
- exec:当前进程加载可执行文件
- waitpid:等待子进程结束并回收子进程资源
- getpid:获取进程号
- gettid:获取线程号
- thread_join:等待线程结束
- thread_create:创建用户线程
- kthread_req:向内核线程发送请求
- thread_exit:线程退出
- proc_eixt:进程退出
- sleep:线程睡眠
- yield:线程放弃CPU,主动调度
- get_time:获取系统时钟数
- 文件类:
- dup:复制文件描述符
- open:打开文件
- close:关闭文件
- pipe:创建管道
- read:从文件读取
- write:向文件写入
- 同步互斥:
- mutex_create:创建互斥锁
- mutex_lock:互斥锁上锁
- mutex_unlock:互斥锁解锁
- semaphore_create:创建信号量
- semaphore_up:增加信号量资源
- semaphore_down:减少信号量资源
- condvar_create:创建条件变量
- condvar_wait: 当前线程阻塞条件变量
- condvar_signal: 唤醒条件变量阻塞的线程
文档的说明
在这个文档中,我们主要说明内核设计中的主要思想和设计原则,以逐步揭示内核的整个架构和运行过程,必要时我们会讨论内核数据结构的设计,但不会对所有代码进行详细说明。