关于 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