+首先,从 Rust语言操作系统的设计与实现,王润基本科毕设论文,2019 和 zCore操作系统内核的设计与实现,潘庆霖本科毕设论文,2020 可以了解到从 rCore 的设计到 zCore 的设计过程的全貌。
+
+zCore 的整体结构/项目设计图如下:
+
+zCore的设计主要有两个出发点:
+
+- 内核对象的封装:将内核对象代码封装为一个库,保证可重用
+- 硬件接口的设计:使硬件与内核对象的设计相对独立,只向上提供统一、抽象的API接口
+
+项目设计从上到下,上层更远离硬件,下层更接近硬件。
+zCore 设计的顶层是上层操作系统,比如 zCore、rCore、Zircon LibOS 和 Linux LibOS。在项目架构中,各版本的操作系统有部分公用代码。与 zCore 微内核设计实现相关的部分则主要是图中左侧蓝色线部分。
+第二层,是 ELF 程序加载层(ELF Program Loader),包括 zircon-loader 和 linux-loader,其中封装了初始化内核对象、部分硬件相关的初始化、设定系统调用接口、运行首个用户态程序等逻辑,并形成一个库函数。zCore 在顶层通过调用 zircon-loader 库中的初始化逻辑,进入第一个用户态程序执行。
+第三层,是系统调用实现层(Syscall Implementation),包括 zircon-syscall 和 linux-syscall,这一层将所有的系统调用处理例程封装为一个系统调用库,供上方操作系统使用。
+第四层,利用硬件抽象层提供的虚拟硬件 API 进行内核对象(Kernel Objects)的实现,并且基于实现的各类内核对象,实现第三层各个系统调用接口所需要的具体处理例程。
+第五层,是硬件抽象层(HAL,Hardware Abstraction Layer),这里对应的是 kernel-hal 模块。kernel-hal 将向上提供所有操作硬件需要的接口,从而使得硬件环境对上层操作系统透明化。
+第六层,是对直接操作硬件的代码进行一层封装,对应模块为 kernel-hal-bare 和 kernel-hal-unix。kernel-hal 系列库仅仅负责接口定义,即将底层硬件/宿主操作系统的操作翻译为上层操作系统可以使用的形式。在这里,kernel-hal-bare 负责翻译裸机的硬件功能,而 kernel-hal-unix 则负责翻译类 Unix 系统的系统调用。
+最底层是底层运行环境,包括 Bare Metal(裸机),Linux / macOS 操作系统。Bare Metal可以认为是硬件架构上的寄存器等硬件接口。
+
+zCore 内核运行时组件层次概况如下:
+
+在zCore启动过程中,会初始化物理页帧分配器、堆分配器、线程调度器等各个组成部分。并委托 zircon-loader 进行内核对象的初始化创建过程,然后进入用户态的启动过程开始执行。每当用户态触发系统调用进入内核态,系统调用处理例程将会通过已实现的内核对象的功能来对服务请求进行处理;而对应的内核对象的内部实现所需要的各种底层操作,则是通过 HAL 层接口由各个内核组件负责提供。
+其中,VDSO(Virtual dynamic shared object)是一个映射到用户空间的 so 文件,可以在不陷入内核的情况下执行一些简单的系统调用。在设计中,所有中断都需要经过 VDSO 拦截进行处理,因此重写 VDSO 便可以实现自定义的对下层系统调用(syscall)的支持。Executor 是 zCore 中基于 Rust 的 async 机制的协程调度器。
+在HAL接口层的设计上,还借助了 Rust 的能够指定函数链接过程的特性。即,在 kernel-hal 中规定了所有可供 zircon-object 库及 zircon-syscall 库调用的虚拟硬件接口,以函数 API 的形式给出,但是内部均为未实现状态,并设置函数为弱引用链接状态。在 kernel-hal-bare 中才给出裸机环境下的硬件接口具体实现,编译 zCore 项目时、链接的过程中将会替换/覆盖 kernel-hal 中未实现的同名接口,从而达到能够在编译时灵活选择 HAL 层的效果。
diff --git a/zcore-intro/image-20200805123801306.png b/zcore-intro/image-20200805123801306.png
new file mode 100644
index 0000000000000000000000000000000000000000..252a09151c8c26cf6bca7dc931934238dc02c2c8
GIT binary patch
literal 164521
zcmeFZ=OfmC8$V2nN~mOqwnX;MXrZEH3n8
3lZ=dv=Hi9(YGh;-gJfh|{%ohj
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