FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Googleのセキュリティにフォーカスした「KataOS」を触ってみる

Googleのリリースしたセキュリティを重視したオペレーティングシステムのKataOS、RISC-Vも視野に入れているということで面白そうなのでチェックしてみることにした。

https://opensource.googleblog.com/2022/10/announcing-kataos-and-sparrow.html

まず、KataOSというのは「安全なオペレーティング システム用のいくつかのコンポーネントオープンソース化した部分」と考えることができるようだ。

マイクロカーネルというのはあまり詳しくないのでよくわからないが、sel4というオープンソースのRealTime OSをベースにしているようだ。

sel4 CAmkESフレームワークというのは、"component architecture for microkernel-based embedded systems"の略で、software development and runtime framework ということらしい。詳しいことはよくわからない。具体的にどういうことができるんだろう。

https://docs.sel4.systems/projects/camkes/

この時点で、sel4とCAmkES、さらにKataOSとsel4の関係がよくわからなくなってきた。さらにKataOS自体はRustで実装されているということだが、これはsel4とどのように結びつくのだろう?

さらにKataOSのリファレンス実装としてSparrowというものも含まれている。Sparrowの立ち位置は、KataOSに加えてハードウェアのプラットフォームを追加している。 Sparrowには、KataOSとRISC-VアーキテクチャのOpenTitanが含まれている。しかし、今回のリリースではQEMUを使用したシミュレーションで実行されるAArch64をターゲットとしているようだ。

repo init -u https://github.com/AmbiML/sparrow-manifest -m camkes-manifest.xml
repo sync -j$(nproc)

この時点でRustをインストールする必要があると告げられた。そういえばインストールしていなかった。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
rustup toolchain add nightly-2021-11-05
rustup target add --toolchain nightly-2021-11-05-x86_64-unknown-linux-gnu aarch64-unknown-none

# なぜかHaskellも必要であった
sudo apt install haskell-stack
cd sparrow
scripts/build-sparrow.sh aarch64

つぎにPythonのもろもろのライブラリが必要なようだ。エラーメッセージに従ってひたすらpipでインストールした。 最初にダウンロードしたものは、何かといろいろ詰まってしまった。一度ディレクトリを削除して、もう一度repoコマンドからやり直すとうまくいったようだ。

   Compiling allocator v0.1.0 (/home/msyksphinz/work/kataos/sparrow/projects/kata/apps/system/components/kata-os-common/src/allocator)
   Compiling toml v0.5.9
   Compiling serde_yaml v0.8.26
   Compiling cargo_toml v0.10.3
   Compiling sel4-config v0.1.0 (/home/msyksphinz/work/kataos/sparrow/projects/kata/apps/system/components/kata-os-common/src/sel4-config)
   Compiling sel4-sys v0.1.0 (/home/msyksphinz/work/kataos/sparrow/projects/kata/apps/system/components/kata-os-common/src/sel4-sys)
   Compiling capdl v0.1.0 (/home/msyksphinz/work/kataos/sparrow/projects/kata/apps/system/components/kata-os-common/src/capdl)
   Compiling model v0.1.0 (/home/msyksphinz/work/kataos/sparrow/projects/kata/apps/system/components/kata-os-common/src/model)
   Compiling kata-os-rootserver v0.1.0 (/home/msyksphinz/work/kataos/sparrow/projects/capdl/kata-os-rootserver)
   Compiling kata-os-common v0.1.0 (/home/msyksphinz/work/kataos/sparrow/projects/kata/apps/system/components/kata-os-common)
    Finished dev [unoptimized + debuginfo] target(s) in 38.24s
[291/291] Generating images/capdl-loader-image-arm-bcm2837
To run the simulator use: (cd build-aarch64 && ./simulate -M raspi3b)

なんとなく動いた気がする。これは何かの計算をしている。

ms-x1carbon:build-aarch64 msyksphinz$ ./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=[7cd000..ce90ff]
No DTB passed in from boot loader.
Looking for DTB in CPIO archive...found at 8c39a8.
Loaded DTB from 8c39a8.
   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..3d0fff]
  vaddr=[400000..590fff]
  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: (482, 131072) empty slots 1 nodes (14, 72) untyped 131072 cnode slots
kata_os_rootserver::Model: 675 objects 1 irqs 0 untypeds 1 asids
kata_os_rootserver::capDL spec: 0.13 Mbytes
kata_os_rootserver::CAmkES components: 0.35 Mbytes
kata_os_rootserver::Rootserver executable: 1.08 Mbytes
<<seL4(CPU 0) [decodeARMFrameInvocation/2137 T0xffffff80003d6400 "rootserver" @43e2cc]: 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