Skip to content
Zhenxing edited this page Jun 28, 2023 · 2 revisions

需求描述

arceos现在是unikernel模式,要给arceos增加宏内核模式,且支持aero操作系统的用户态程序(包括图形界面程序)。

新内核命名为清河(qinghe),其类型可称为元内核(meta-kernel)。

目标

  • 对三种架构(x86_64, arm64, riscv64)都要进行适配,而不应在某个架构上跑不起来。
  • 支持的是宏内核模式,而不应限制为只能实现某个宏内核。
  • 是源码级支持aero操作系统的用户态程序,而不是二进制级。
  • rustc编译器使用stable版,而不使用nightly版。

设计原则

  • 设计思想:两种模块化

    模块化还在探索中,可能有很多的内涵。我觉得至少是有两层含义:静态模块化和动态模块化。

    静态的模块化:例如现在的arceos,编译时进行模块的组装,运行时模块就不能再改变了。

    动态的模块化:例如Linux和minix,不仅编译时进行模块的组装,还能运行时加载或替换模块。

  • 设计思想高于语言。

    设计思想是模块化,语言是rust。

    例如:crate是语言里提出来的概念,crates目录从设计的角度来看主要放的都是驱动程序,所以这个目录应该叫drivers。

    例如:rust_main()函数从语言的角度看是进到了rust写的主控函数,但从设计的角度来看它是内核的主控函数,所以应该叫kernel_main()或kernel_init()。

    例如:模块化的内核里到处都是模块,modules目录这种命名方式没有明确的指向性,但从设计的角度来看它放的是内核的核心代码,所以这个目录应该叫kernel。

  • 设计思想高于第三方库。

    当第三方库和设计思想冲突,但它又是内核所需要的,应对这个库进行更彻底的模块化改造,并单独维护自己的版本。

    例如:文件系统第三方库可能都是需要改造的。

  • 简单直接

    代码在内在逻辑和外在形式上都应能少则少。

    例如:rust代码默认是有src目录,凭空增加了路径的深度。

    例如:使用面向对象的语言很容易就建立了很多对象,使调用路径太长。

规划

  1. 理解arceos的实现。分析宏内核的本质。思考arceos怎么加入宏内核模式。计划15天。

    unikernel支持确定的应用,所以它的思路是包含最少模块。宏内核是要支持尽可能多的应用,所以它的思路是包含尽可能全的模块。

  2. 依据上步思考的结果,实现宏内核模式。计划30天。

    1. 一个可在qemu上运行的最小二进制镜像。

      多架构支持。

    2. uart驱动支持。

    3. 原子操作与同步原语支持

    4. 日志系统支持。

    5. 内存管理系统支持。

    6. 中断、自陷的支持。

      包括特权级切换的实现

    7. 进程管理系统支持

      包括第一个用户进程的生成

    8. 调度器的支持。

    9. 块设备驱动支持

      普通的块设备,ramdisk

    10. 文件系统支持

      要支持ext2文件系统。fat在设计上有明显缺陷,不进行默认的支持。

    11. 系统调用支持

    12. 简单userland支持

      基本的app,简单的ulib。

      在实现宏内核后,下阶段主要目标就是进行完整userland的支持。

    13. 网卡驱动支持

    14. 网络协议栈支持

    15. gpu驱动支持

  3. 适配aero操作系统的用户态程序。计划45天。