关于 Starry

概述

支持情况

应用场景

快速上手 Starry

实验环境配置

下面是初步的本地配置过程

实验环境

  • 操作系统:Ubuntu 24.04
  • QEMU >= 9.1
  • musl: x86_64 + riscv64 + aarch64 + loongarch64

配置Rust开发环境

首先安装 Rust 版本管理器 rustup 和 Rust 包管理器 cargo,这里我们用官方的安装脚本来安装:

curl https://sh.rustup.rs -sSf | sh

如果通过官方的脚本下载失败了,可以在浏览器的地址栏中输入 https://sh.rustup.rs 来下载脚本,在本地运行即可。

可通过如下命令安装 rustc 的 nightly 版本。

rustup install nightly

再次确认一下我们安装了正确的 rustc 版本(以下为一个示例):

$ rustc --version
rustc 1.83.0 (90b35a623 2024-11-26)

安装必要依赖

echo "deb http://apt.llvm.org/bookworm/ llvm-toolchain-bookworm main" | sudo tee -a /etc/apt/sources.list
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
sudo apt-get update \
    && apt-get install -y --no-install-recommends libclang-19-dev wget make python3 \
        xz-utils python3-venv ninja-build bzip2 meson cmake dosfstools build-essential \
        pkg-config libglib2.0-dev git libslirp-dev  \
    && rm -rf /var/lib/apt/lists/*

安装QEMU

# 安装与qemu相关的软件包
$ wget https://download.qemu.org/qemu-9.2.1.tar.xz
$ tar xf qemu-9.2.1.tar.xz \
    && cd qemu-9.2.1 \
    && ./configure --prefix=/qemu-bin-9.2.1 \
        --target-list=loongarch64-softmmu,riscv64-softmmu,aarch64-softmmu,x86_64-softmmu \
        --enable-gcov --enable-debug --enable-slirp \
    && make -j$(nproc) \
    && make install
# 配置环境变量。。
# 测试是否正确安装
$ qemu-system-x86_64 --version

$ rm -rf qemu-9.2.1 qemu-9.2.1.tar.xz

安装 musl cross 工具链

wget https://musl.cc/aarch64-linux-musl-cross.tgz
wget https://musl.cc/riscv64-linux-musl-cross.tgz
wget https://musl.cc/x86_64-linux-musl-cross.tgz
wget https://github.com/LoongsonLab/oscomp-toolchains-for-oskernel/releases/download/loongarch64-linux-musl-cross-gcc-13.2.0/loongarch64-linux-musl-cross.tgz
# install
tar zxf aarch64-linux-musl-cross.tgz
tar zxf riscv64-linux-musl-cross.tgz
tar zxf x86_64-linux-musl-cross.tgz
tar zxf loongarch64-linux-musl-cross.tgz

rm -f *.tgz

在 Docker 下运行

请参考如下 Dockerfile

FROM rust:slim

RUN apt-get update && apt-get install -y wget

RUN echo /etc/apt/sources.list << deb http://apt.llvm.org/bookworm/ llvm-toolchain-bookworm main
RUN wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc

RUN apt-get update \
    && apt-get install -y --no-install-recommends libclang-19-dev make python3 \
    xz-utils python3-venv ninja-build bzip2 meson \
    pkg-config libglib2.0-dev git libslirp-dev cmake dosfstools build-essential \
    && rm -rf /var/lib/apt/lists/*

RUN cargo install cargo-binutils axconfig-gen

COPY rust-toolchain.toml /rust-toolchain.toml

RUN rustc --version

RUN wget https://musl.cc/aarch64-linux-musl-cross.tgz \
    && wget https://musl.cc/riscv64-linux-musl-cross.tgz \
    && wget https://musl.cc/x86_64-linux-musl-cross.tgz \
    && wget https://github.com/LoongsonLab/oscomp-toolchains-for-oskernel/releases/download/loongarch64-linux-musl-cross-gcc-13.2.0/loongarch64-linux-musl-cross.tgz \
    && tar zxf aarch64-linux-musl-cross.tgz \
    && tar zxf riscv64-linux-musl-cross.tgz \
    && tar zxf x86_64-linux-musl-cross.tgz \
    && tar zxf loongarch64-linux-musl-cross.tgz \
    && rm -f *.tgz

RUN wget https://download.qemu.org/qemu-9.2.1.tar.xz \
    && tar xf qemu-9.2.1.tar.xz \
    && cd qemu-9.2.1 \
    && ./configure --prefix=/qemu-bin-9.2.1 \
    --target-list=loongarch64-softmmu,riscv64-softmmu,aarch64-softmmu,x86_64-softmmu \
    --enable-gcov --enable-debug --enable-slirp \
    && make -j$(nproc) \
    && make install
RUN rm -rf qemu-9.2.1 qemu-9.2.1.tar.xz

ENV PATH="/x86_64-linux-musl-cross/bin:/aarch64-linux-musl-cross/bin:/riscv64-linux-musl-cross/bin:/loongarch64-linux-musl-cross/bin:/qemu-bin-9.2.1/bin:$PATH"

请执行如下指令

$ git clone git@github.com:oscomp/starry-next.git
$ cd starry-next

$ ./scripts/get_deps.sh
$ cd .arceos
$ docker build -t starry -f ./Dockerfile .
$ cd ..

# 在项目根目录下构建容器
$ docker run -it -v $(pwd):/starry -w /starry starry bash

若 Docker pull 或 Docker build 出现超时等问题,可能是因为缺乏代理上网的配置。可以参考如下资料:

  • Docker pull
    • 使用代理:https://docs.docker.com/reference/cli/docker/image/pull/#proxy-configuration
    • 换用可用国内源(自行查找)
  • Docker build
    • 使用代理:https://docs.docker.com/engine/cli/proxy/#build-with-a-proxy-configuration
  • Docker run 也可以使用代理选项,相关操作与 build 类似,可以自行查阅资料

进入项目目录

# 若还未拉取 Starry Next 仓库
$ git clone git@github.com:oscomp/starry-next.git
$ cd starry-next

# 拉取基座仓库 ArceOS
$ ./scripts/get_deps.sh

# 配置 Rust 环境
$ cd .arceos
$ rustup target add x86_64-unknown-linux-musl
$ rustup target add aarch64-unknown-linux-musl
$ rustup target add riscv64gc-unknown-linux-musl
$ rustup target add x86_64-unknown-none  
$ rustup target add riscv64gc-unknown-none-elf
$ rustup target add aarch64-unknown-none
$ rustup target add aarch64-unknown-none-softfloat
$ rustup component add llvm-tools-preview
$ cargo install cargo-binutils axconfig-gen
$ cd ..

Qemu 快速上手

飞腾派启动

泉城x86工控机启动

星光派二代 SiFive 启动

Starry 使用手册

本章的流程如下:

运行基本测例

运行OS比赛测例

接入不同的驱动

运行更多复杂应用

Starry 原理介绍

架构设计

本章节简要介绍组件化系统 ArceOS 中不同模块的功能与接口文档。

ArceOS

基座内核 ArceOS 以组件化内核的思想进行设计,设计架构图如下:

每一个模块的简要介绍如下:

  • crates layer: 内核无关组件,如 page_table, slab_allocator, spinlock 等,可以方便地给其他内核进行复用

  • modules layer: 内核相关的组件。他们与内核的核心功能相关,不容易解耦出来给其他内核使用,但是对内核本身的功能以及重构有重要作用。

    • axalloc: 用于内核内存分配的模块
    • axfs: 文件系统管理模块, 接入了 fat32
    • axhal: 硬件抽象层模块
    • axnet: 网络管理模块,接入了 smoltcp 网络协议栈
    • axdriver: 驱动管理模块
    • axtask: 任务管理模块,包括任务单元的定义和调度功能的实现
    • axsync: 同步原语模块,包括一些 mutex 等同步原语等实现
    • axmm: 地址空间管理模块,包括内存映射等功能的实现
  • axfeat: feature 描述层,用于进行 feature 的定制和转发,从而实现组件定制化的功能

    • feature 是 rust 条件编译的重要环节,详见文档
  • api layer: ArceOS 对外提供的接口层

    • arceos_posix_api: POSIX 接口兼容实现层,在初始时是调用了 Unikernel 的接口,在 Starry 中会为其加入更多宏内核的支持
    • arceos_api: Unikernel 自身提供的接口层,用于其他应用程序调用内核的功能
  • ulib layer: 用户库层,将 api layer 的接口进一步封装为更加兼容、常见的接口

    • axstd: rust std 的 Unikernel 实现,它调用的是 arceos 的功能,但是提供了更加常见的 std 接口
    • axlibc: libc 的 Unikernel 实现,它调用的是 arceos 的功能,但是提供了更加常见的 libc 接口
  • user layer: 用户层,包括用户程序和用户程序的测试用例

    • rust app: rust 语言编写的用户程序,调用 axstd 从而调用 Unikernel 内核的功能
    • c app: c 语言编写的用户程序,与 axlibc 链接从而调用 Unikernel 内核的功能

关于 ArceOS 的接口更加详细的说明文档位于:arceos

其他相关材料包括:

  • Unikernel 架构说明: https://dl.acm.org/doi/10.1145/2490301.2451167
  • ArceOS 指导书 https://rcore-os.cn/arceos-tutorial-book/index.html
  • ArceOS 教学视频:https://opencamp.cn/os2edu/camp/2024fall/stage/3

Starry

Starry 的目录结构 TODO

Starry 启用与运行

Starry 宏内核扩展

任务调度接口

多核调度的实现

Starry 系统调用

blk 设备

net 设备

display 设备

动态选择驱动

系统调用

文件系统接口

适配不同文件系统

网络协议栈

网络协议栈接口

适配不同网络协议栈

宏内核扩展与系统调用

Starry 开发规划