sparrow-manifest - プロジェクトスズメ:レポマテリアル

(Project Sparrow: Repo Materials)

Created at: 2022-08-11 01:50:32
Language:
License: Apache-2.0

プロジェクトスズメ

Sparrowは、アンビエントMLアプリケーション用の低消費電力で安全な埋め込みプラットフォームを構築するプロジェクトです。ターゲットプラットフォームはRISC-VOpenTitanを活用しています。Sparrowソフトウェアには、seL4上で動作し、(seL4カーネルを無視して)ほぼ完全にRustで書かれているKataOSという名前の自家製のオペレーティングシステムが含まれています。

スズメ(とKataOS)は間違いなく進行中の作業です。KataOS コンポーネントは、seL4 の CAmkES フレームワークの拡張バージョンに基づいています。重要なシステム サービスは、静的に構成された CAmkES コンポーネントです。アプリケーションは、AmbiML に重点を置いた SDK を使用して開発され、システム サービスによって動的に読み込まれます。

[当初、SparrowリポジトリにはseL4 / CAmkESコンポーネントを開発するためのRustフレームワークのみが含まれています。今後のリリースでは、アプリケーションの動的操作をサポートする MemoryManager や ProcessManager などの KataOS サービスが共有される予定です。

Sparrow ソフトウェアリポジトリ (ここに含まれているもの)。

Sparrowは、レポツールと一緒にステッチされた複数のgitリポジトリで構成されています。現在、以下のgitリポジトリが利用可能です:

  • camkes-tool: seL4 の camkes-tool リポジトリで、KataOS サービスをサポートするために追加されている
  • capdl: seL4 の capdl リポジトリで、KataOS サービスと KataOS ルートサーバ (Rust で書かれ、KataOS MemoryManager サービスへのシステムリソースのハンドオフをサポートする capdl-loader-app の代替) が追加されています。
  • カーネル: seL4 のカーネルと Sparrow の RISC-V プラットフォーム用のドライバと、KataOS ルートサーバが使用するメモリの再利用のサポート
  • Rustで開発するためのカタフレームワーク、および(最終的には)KataOSシステムサービス
  • スクリプト:build-sparrow.sh を含むサポートスクリプト

[最終的にすべてのSparrow(ソフトウェアとハードウェアの設計)が利用可能になるまで、共有の準備ができていると判断したより多くのソフトウェアが公開されます。

ほとんどのKataOS Rustクレートは、kata/apps/system/componentsディレクトリにあります。共通/共有コードはカタ・オズ・コモンにあります:

  • アロケータ: リンクリストアロケータクレート上に構築されたヒープアロケータ
  • camkes: Rust で CAmkES コンポーネントを書くためのサポート
  • capdl: capDL ツールによって生成された capDL 仕様の読み取りのサポート
  • コピー領域:物理ページをスレッドのVSpaceに一時的にマッピングするためのヘルパー
  • cspace-slot: スロットアロケータ用の RAII ヘルパー
  • ロガー:錆ロガークレートとのseL4統合
  • モデル: capDL の処理のサポート。カタ-OS-ルートサーバによって使用されます
  • パニック: seL4 固有のパニックハンドラ
  • sel4-config: seL4 カーネルコンフィグレーション用のグルーを構築する
  • sel4-sys: seL4 システムインタフェースと接着剤
  • スロットアロケータ:トップレベルのCNodeのスロットのアロケータ

もう1つの主要なRust部分は、プロジェクト/ capdl / kata-os-rootserverにあるルートサーバーアプリケーションです。これは、kata-os-commoncapdl サブモジュールとモデルサブモジュールに依存します。CAmkESプロジェクトのeasy-settings.cmakeファイルでCMake設定を使用して、kata-os-rootserverまたはCベースのcapdl-loader-appのいずれかを選択できます。例えば。 は:

projects/kata/easy-settings.cmake

#set(CAPDL_LOADER_APP "capdl-loader-app" CACHE STRING "")
set(CAPDL_LOADER_APP "kata-os-rootserver" CACHE STRING "")

kata-os-rootserverのテストは非常に限られており、capdl-loader-appのすべての機能をサポートおよび/または実装していない可能性が高いことに注意してください。

スパロウのソフトウェア開発のやり方

当社の主要な開発環境では、Sparrowハードウェア設計のシミュレーションにRenodeを使用しています。Renodeにより、マルチコアRISC-Vターゲットプラットフォームの迅速なソフトウェア/ハードウェア共同設計を行うことができます。ソフトウェア環境は、seL4 と OpenTitan が提供する環境から派生しています。デバッグでは、RenodeファシリテスとgdbがRenodeと通信してシステムソフトウェアとアプリケーション開発を行います。

[この最初のロールアウトでは、qemu 上で実行される aarch64 をターゲットにしています。

レポとビルドスズメを使い始める。

このリポジトリには、Sparrow オープンソースプロジェクトで使用するスクリプトが含まれています。これらのスクリプトは、新規ユーザーがプロジェクト、その構築方法、および独自のプロジェクトで Sparrow を利用する方法に慣れるのに役立つことを目的としています。

  1. リポジトリツールを使用してGitHubからこのプロジェクトをクローンする この土地の下には "sparrow"という名前のトップレベルディレクトリがあると仮定します。
  2. 指定されたターゲット・アーキテクチャー用のサンプル CAmkES アプリケーションをダウンロードし、ビルドして実行します。今のところ、動作する唯一のターゲットは "aarch64"(qemuのシミュレーションで実行されているraspi3bマシンの場合)です。
mkdir sparrow
cd sparrow
repo init -u https://github.com/AmbiML/sparrow-manifest -m camkes-manifest.xml
repo sync -j$(nproc)
sh scripts/build-sparrow.sh aarch64
(cd build-aarch64; ./simulate -M raspi3b)

[あなたのレポツールが古くなっている場合は、古いバージョンのリポジトリがブランチをチェックするだけなので、initリクエストに提供する必要があるかもしれないことに注意してください。

-b main
master

上記は、システムとシェルの検索パスに次の前提条件がインストールされていることを前提としています。

  1. ターゲットアーキテクチャの Gcc (または clang)
  2. 錆;現時点では、これは毎晩-2021-11-05でなければなりません(または少なくとも build-sparrow.sh を編集する準備をしてください)。CAmkESが使用するものと一致するようにデフォルトのTLSモデルをオーバーライドし、このオーバーライドはRustの安定バージョンではサポートされていないことに注意してください。
  3. python tempita モジュール。
  4. seL4がターゲットアーキテクチャに期待するシミュレータ。例えば、aarch64の場合、これはqemu-system-aarch64です。

Sparrow は CAmkES プロジェクトであるため、CAmkES の依存関係も必要です。

Sparrow は repo を使用して Sparrow git リポジトリや seL4 などの依存プロジェクト/リポジトリをダウンロードしてつなぎ合わせます。

$ repo init -u https://github.com/AmbiML/sparrow-manifest -m camkes-manifest.xml
Downloading Repo source from https://gerrit.googlesource.com/git-repo

repo has been initialized in <your-directory>/sparrow/
If this is not the directory in which you want to initialize repo, please run:
   rm -r <your-directory>/sparrow//.repo
and try again.
$ repo sync -j12
Fetching: 100% (23/23), done in 9.909s
Garbage collecting: 100% (23/23), done in 0.218s
Checking out: 100% (23/23), done in 0.874s
repo sync has finished successfully.
$ sh scripts/build-sparrow.sh aarch64
info: component 'rust-std' for target 'aarch64-unknown-none' is up to date
loading initial cache file <your-directory>/sparrow/projects/camkes/settings.cmake
-- Set platform details from PLATFORM=rpi3
--   KernelPlatform: bcm2837
--   KernelARMPlatform: rpi3
-- Setting from flags KernelSel4Arch: aarch64
-- Found seL4: <your-directory>/sparrow/kernel
-- The C compiler identification is GNU 11.2.1
...
[291/291] Generating images/capdl-loader-image-arm-bcm2837
$ cd build-aarch64; ./simulate -M raspi3b
./simulate: qemu-system-aarch64 -machine raspi3b  -nographic -serial null -serial mon:stdio -m size=1024M  -kernel images/capdl-loader-image-arm-bcm2837
ELF-loader started on CPU: ARM Ltd. Cortex-A53 r0p4
  paddr=[8bd000..fed0ff]
No DTB passed in from boot loader.
Looking for DTB in CPIO archive...found at 9b3ef8.
Loaded DTB from 9b3ef8.
   paddr=[23c000..23ffff]
ELF-loading image 'kernel' to 0
  paddr=[0..23bfff]
  vaddr=[ffffff8000000000..ffffff800023bfff]
  virt_entry=ffffff8000000000
ELF-loading image 'capdl-loader' to 240000
  paddr=[240000..4c0fff]
  vaddr=[400000..680fff]
  virt_entry=4009e8
Enabling MMU and paging
Jumping to kernel-image entry point...

Warning:  gpt_cntfrq 62500000, expected 19200000
Bootstrapping kernel
Booting all finished, dropped to user space
kata_os_rootserver::Bootinfo: (725, 131072) empty slots 1 nodes (14, 74) untyped 131072 cnode slots
kata_os_rootserver::Model: 676 objects 1 irqs 0 untypeds 1 asids
kata_os_rootserver::capDL spec: 0.13 Mbytes
kata_os_rootserver::CAmkES components: 1.07 Mbytes
kata_os_rootserver::Rootserver executable: 1.31 Mbytes
<<seL4(CPU 0) [decodeARMFrameInvocation/2137 T0xffffff80004c7400 "rootserver" @44373c]: ARMPageMap: Attempting to remap a frame that does not belong to the passed address space>>
client: what's the answer to 342 + 74 + 283 + 37 + 534 ?
adder: Adding 342
adder: Adding 74
adder: Adding 283
adder: Adding 37
adder: Adding 534
client: result was 1270

build-sparrow.sh スクリプトは繰り返し実行できます。セットアップをリセットする必要がある場合は、ビルドツリーを削除して再実行し build-sparrow.sh す。例えば。

cd sparrow
rm -rf build-aarch64
sh scripts/build-sparrow.sh aarch64

ローカルプロジェクトのセットアップ

スズメリポジトリの初期化に使用される camkes-manifest.xml ファイルは、上流の seL4 からサンプル CAmkES テストを構築するために特別に構築されています。独自の seL4 / CAmkES プロジェクトを構築するには、seL4 のドキュメントに従ってください

錆びた木箱に応じて

Sparrow の木箱を使うには、ローカルリポジトリから参照するか、git を使って GitHub から直接参照することができます。例えば、Config.tomlでは:

kata-os-common = { path = "../system/components/kata-os-common" }
kata-os-common = { git = "https://github.com/AmbiML/sparrow/kata" }

注意: git の使用法は、カタレポで "kata-os-common" という名前の木箱を検索するための貨物のサポートに依存します。git依存関係を使用する場合、gitタグを使用してクレートバージョンをロックすることができます。

多くの Sparrow クレートには seL4 カーネルコンフィグレーションが必要であることに注意してください (MCS が設定されているかどうかを知るためなど)。これは、カーネルコンフィグレーションパラメータを Cargo 機能としてインポートするために build.rs によって使用される kata-os-common/sel4-config クレートによって処理されます。Cargo.tomlでは、必要なカーネルパラメータを含む機能マニフェストを作成します。

[features]
default = []
# Used by sel4-config to extract kernel config
CONFIG_PRINTING = []

次に、ビルド依存関係を指定します。

[build-dependencies]
# build.rs depends on SEL4_OUT_DIR = "${ROOTDIR}/out/kata/kernel"
sel4-config = { path = "../../kata/apps/system/components/kata-os-common/src/sel4-config" }

少なくとも以下を含む build.rs を使用します。

extern crate sel4_config;
use std::env;

fn main() {
    // If SEL4_OUT_DIR is not set we expect the kernel build at a fixed
    // location relative to the ROOTDIR env variable.
    println!("SEL4_OUT_DIR {:?}", env::var("SEL4_OUT_DIR"));
    let sel4_out_dir = env::var("SEL4_OUT_DIR")
        .unwrap_or_else(|_| format!("{}/out/kata/kernel", env::var("ROOTDIR").unwrap()));
    println!("sel4_out_dir {}", sel4_out_dir);

    // Dredge seL4 kernel config for settings we need as features to generate
    // correct code: e.g. CONFIG_KERNEL_MCS enables MCS support which changes
    // the system call numbering.
    let features = sel4_config::get_sel4_features(&sel4_out_dir);
    println!("features={:?}", features);
    for feature in features {
        println!("cargo:rustc-cfg=feature=\"{}\"", feature);
    }
}

build.rs がカーネルビルド領域の先頭へのパスを持つSEL4_OUT_DIR環境変数をどのように期待しているかに注目してください。build-sparrow.sh スクリプトはこれを設定しますが、たとえば、忍者を直接実行する場合は、環境内で設定する必要があります。

Rust プログラム用の seL4 システムコールラッパーを持つ kata-os-common/src/sel4-sys クレートをSEL4_OUT_DIRするのと同様に、カーネルソースの先頭へのパスを持つSEL4_DIR環境変数が必要です。これも build-sparrow.sh によって設定されます。

ソースコードヘッダー

ソースコードを含むすべてのファイルには、著作権とライセンス情報が含まれています。依存/非Googleコードの場合、これらはアップストリームリポジトリから継承されます。Googleの変更がある場合は、Google Apacheライセンスが以下にあります。

Apacheヘッダー:

Copyright 2022 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.