学习概况
- 潘庆霖学长zcore毕业论文阅读
- 完成zCore-tutorial前三章,及前三章代码理解
- 看了代码有关,例如weak, std::sync::atomic等相关语法
- 完成前三章理解记录,已上传到自己的repo
- repo:https://codechina.csdn.net/qq_40298363/zcore-tutorial
要点理解
RUST语言特点
- 内存安全:所有权机制
- 线程安全:在 Rust 中,要求可能被不同线程访问到的变量必须实现 Sync Trait,或者用实现了 Sync Trait 的互斥锁对相关变量进行封装
- unsafe: 在 Rust 中,如果完全遵循我们前面提到的所有权机制和线程安全的限定,在类似系统内核这样的底层领域,有部分功能将会无法实现。Rust 给出的 unsafe 语法,允许开发者使用 unsafe 关键字划定代码块,在unsafe 代码块内部,开发者可以绕过部分编译期检查,灵活地使用裸指针操作内存,使用嵌入汇编对代码进行优化、对硬件进行控制,等等
zCore设计原则
核心理解:将内核服务用面向对象的思想封装
kernelhalbare:完全基于实际硬件的接口实现
kernelhal:向上提供一套硬件相关 API,这一套 API 给出上层实现所需要的所有操作硬件的接口,API 之内的实现和所依赖的环境,对于上层实现而言是透明的
object层:内核对象实现
syscall:实现各个系统调用的处理例程,将所有的处理例程封装为一个系统调用库
zirconloader 库中,将内核中初始化内核对象、设定系统调用入口、运行首个用户态程序等逻辑进行封装,形成一个库函数
优势:可扩展性,安全,可移植性
kernel-hal实现
对比以前的代码增加了HAL硬件抽象层,可以看出kernel-hal只提供了接口,kernel-hal-unix提供了实现。在 HAL 接口层的设计上,我们借助 Rust 的能够指定函数链接过程的特性。在 kernelhal 中规定了所有可供 zirconobject 库及 zirconsyscall 库调用的虚拟硬件接口,以函数 API 的形式给出,内部均为未实现状态,并设置函数为弱引用链接状态。在 kernelhalbare 中给出裸机环境下的硬件接口具体实现,在 zCore 项目编译、链接的过程中将会替换 kernelhal 中未实现的同名接口,从而达到能够在编译时灵活选择 HAL 层的效果。
kernelhal 库仅负责接口定义,具体的实现可以有多种形式,完全基于实际硬件的 kernelhalbare能够让上层 OS 运行在实际硬件上,基于宿主 OS 提供的系统调用进行实现的kernelhalunix 能够让上层 OS 内核运行在 Linux 这样的类 Unix 系统上。
加入kernel-hal目的,是为了更好满足硬件平台异构性
组合
rust中没有继承机制,可利用组合代替。使用一个 struct 来提供所有的公共属性和方法,作为所有类的第一个成员,利用一个宏为内核对象 struct 自动实现 KernelObject trait 的宏。如此可实现代码复用,不用为每一个内核对象手动实现KernelObject trait。安全,高效。
async机制
每个异步任务分成三个阶段:
- 轮询阶段(poll phase)。一个 Future 被轮询后,会开始执行直到被阻塞。通常由执行器 Executor 负责对 Future 进行轮询;
- 等待阶段。事件源 Reactor 注册等待一个事件发生,并确保当该事件准备好后唤醒相应的 Future。
- 唤醒阶段。事件发生,对应的 Future 被唤醒,执行器 Executor 调度该 Future 再一次轮询它,此时返回的结果表明继续执行的条件已满足,该异步任务会继续执行直到再一次被阻塞,回到轮询阶段。如此不断循环直到这个异步任务全部完成。
Rust 中的异步运行时可以分成两个部分:
- 事件源 Reactor;
- 执行器 Executor。
前者负责通知一个 Future 它的等待条件达成,可以继续向下执行;后者则负责对多个 Future(也就是多个异步任务)进行执行,并在此期间负责它们的调度、管理。这两部分的功能完全独立,在中间层通过 Waker 进行协作。