1 个不稳定版本

0.1.0 2019年11月19日

#315 in Operating systems

1,637 stars & 53 watchers

515KB
12K SLoC

zCore

CI Docs Coverage Status issue forks stars license

基于 zircon 并提供 Linux 兼容性的操作系统内核。

原版README

使用安全的 Rust 重新实现 Zircon 微内核,作为一个用户空间程序!

  • zCore 设计架构概述
  • 支持 bare-metal 模式的 Zircon & Linux
  • 支持 libos 模式的 Zircon & Linux
  • 关于支持的图形应用程序等更多信息,请查看原版 README 文档

启动内核

cargo qemu --arch riscv64

此命令会使用 qemu-system-riscv64 启动 zCore。

默认的文件系统中将包含 busybox 应用程序和 musl-libc 链接器。它们是用自动下载的 musl-libc RISC-V 交叉编译工具链编译的。

目录

项目构建

项目构建采用 xtask 模式,常用操作被封装成 cargo 命令。

此外,还通过 Makefile 提供 make 调用,以兼容一些旧脚本。

目前已测试的开发环境包括 Ubuntu20.04、Ubuntu22.04 和 Debian11,Ubuntu22.04 无法正确编译 x86_64 的 libc 测试。若不需要烧写到物理硬件,使用 WSL2 或其他虚拟机的操作与真机并无不同之处。

构建命令

命令的基本格式为 cargo <command> [--args [value]],这实际上是 cargo run --package xtask --release -- <command> [--args [value]] 的简写。command 被传递给 xtask 应用程序,解析并执行。

许多命令的效果受到仓库环境的影响,也会影响仓库的环境。为了使用方便,如果一个命令依赖于另一个命令的效果,它们被设计为递归的。命令的递归关系图如下,对于它们的详细解释在下一节:


注意 建议使用等宽字体


┌────────────┐ ┌─────────────┐ ┌─────────────┐
| update-all | | check-style | | zircon-init |
└────────────┘ └─────────────┘ └─────────────┘
┌─────┐ ┌──────┐  ┌─────┐  ┌─────────────┐ ┌─────────────────┐
| asm | | qemu |─→| bin |  | linux-libos | | libos-libc-test |
└─────┘ └──────┘  └─────┘  └─────────────┘ └─────────────────┘
                     |            └───┐┌─────┘   ┌───────────┐
                     ↓                ↓↓      ┌──| libc-test |
                 ┌───────┐        ┌────────┐←─┘  └───────────┘
                 | image |───────→| rootfs |←─┐ ┌────────────┐
                 └───────┘        └────────┘  └─| other-test |
                 ┌────────┐           ↑         └────────────┘
                 | opencv |────→┌───────────┐
                 └────────┘  ┌─→| musl-libc |
                 ┌────────┐  |  └───────────┘
                 | ffmpeg |──┘
                 └────────┘
-------------------------------------------------------------------
图例:A 递归执行 B(A 依赖 B 的结果,执行 A 时自动先执行 B)
┌───┐  ┌───┐
| A |─→| B |
└───┘  └───┘

命令参考

如果下面的命令描述与行为不符,或怀疑此文档更新不及时,亦可直接查看内联文档。 如果发现 error: no such subcommand: ...,查看命令简写为哪些命令设置了别名。


注意 内联文档也是中英双语


update-all

更新工具链、依赖和 git 子模块。

如果没有递归克隆子模块,可以使用这个命令克隆。

cargo update-all

check-style

静态检查。设置多种编译选项,检查代码能否编译。

cargo check-style

zircon-init

下载 zircon 模式所需的二进制文件。

cargo zircon-init

asm

反汇编并保存指定架构的内核。默认保存到 target/zcore.asm

cargo asm -m virt-riscv64 -o z.asm

bin

生成内核 raw 镜像到指定位置。默认输出到 target/{arch}/release/zcore.bin

cargo bin -m virt-riscv64 -o z.bin

qemu

在 Qemu 中启动 zCore。这需要 Qemu 已经安装好了。

cargo qemu --arch riscv64 --smp 4

支持将 qemu 连接到 gdb:

cargo qemu --arch riscv64 --smp 4 --gdb 1234

rootfs

重建 Linux rootfs。直接执行这个命令会清空已有的为此架构构造的 rootfs 目录,重建最小的 rootfs。

cargo rootfs --arch riscv64

musl-libs

将 musl 动态库拷贝到 rootfs 目录对应位置。

cargo musl-libs --arch riscv64

ffmpeg

将 ffmpeg 动态库拷贝到 rootfs 目录对应位置。

cargo ffmpeg --arch riscv64

opencv

将 opencv 动态库拷贝到 rootfs 目录对应位置。如果 ffmpeg 已经放好了,opencv 将会编译出包含 ffmepg 支持的版本。

cargo opencv --arch riscv64

libc-test

将 libc 测试集拷贝到 rootfs 目录对应位置。

cargo libc-test --arch riscv64

other-test

将其他测试集拷贝到 rootfs 目录对应位置。

cargo other-test --arch riscv64

image

从 rootfs 目录构建 Linux rootfs 镜像文件。

cargo image --arch riscv64

linux-libos

在 linux libos 模式下启动 zCore 并执行位于指定路径的应用程序。

注意 libos 模式只能执行单个应用程序,完成就会退出。

cargo linux-libos --args "/bin/busybox"

可以直接给应用程序传参数:

cargo linux-libos --args "/bin/busybox ls"

平台支持

Qemu/virt

直接使用命令启动,参见启动内核qemu 命令

全志/哪吒

使用以下命令构造系统镜像:

cargo bin -m nezha -o z.bin

然后使用 rustsbi-d1 将镜像部署到 Flash 或 DRAM。

另: 可以查看README for D1 文档获知更多D1开发板有关的操作指导。

赛昉/星光

使用以下命令构造系统镜像:

cargo bin -m visionfive -o z.bin

然后根据此文档的详细说明通过 u-boot 网络启动系统。

晶视/cr1825

使用以下命令构造系统镜像:

cargo bin -m cr1825 -o z.bin

然后通过 u-boot 网络启动系统。

其他


lib.rs:

Zircon 内核对象

功能标志

  • elf: 启用 zircon_object::util::elf_loader.
  • hypervisor: 启用 zircon_object::hypervisor (Guest and Vcpu).

依赖项

~2.1–3MB
~55K SLoC