$30 off During Our Annual Pro Sale. View Details »

WASMを実行する自作Microkernel, mavisの紹介

RI5255
September 23, 2023

WASMを実行する自作Microkernel, mavisの紹介

2023/9/23 第35回 自作OSもくもく会オンライン の@RI5255 (https://twitter.com/RI5255) の発表資料です。

RI5255

September 23, 2023
Tweet

More Decks by RI5255

Other Decks in Technology

Transcript

  1. WASMバイナリを実行する自作Microkernel, mavisの紹介
    -WASM x Microkernelが描く未来-
    第35回 自作OSもくもく会オンライン
    @RI5255

    View Slide

  2. 仕組みを理解したい!!
    OTFって何? NTFSって何?
    Cコンパイラの仕組みは?
    USBドライバの仕組みは?
    自己紹介
    ・低レイヤが好き
    ・重度のフルスク病
    ・CTFはpwnが好き
    @RI5255
    1

    View Slide

  3. WASM Runtime x Microkernel !!
    https://github.com/RI5255/mavis
    2

    View Slide

  4. WASMとは?
    ・仮想CPUの命令セット及びバイナリフォーマットの仕様
    ・スタックマシンベースの命令セット
    3
    ・いろいろな言語からWASMにコンパイルできる(Rust, C, Go etc…)

    View Slide

  5. Microkernelとは?
    user
    タスクスケジューラ
    デバイスドライバ
    ファイルシステム
    シンプルで必要最低限のinterface
    必要最小限の機能
    kernel
    server
    4

    View Slide

  6. WASM Runtime x Microkernelとは?
    user
    タスクスケジューラ
    デバイスドライバ
    ファイルシステム
    シンプルで必要最低限のinterface
    WASM Runtime
    kernel
    WASM
    全てのserverがWASMバイナリなMicrokernel !!
    5

    View Slide

  7. Motivation
    モノリシックkernel
    タスクスケジューラ
    デバイスドライバ
    ファイルシステム
    kernel user
    system calls
    ・同じOS、同じアーキテクチャである限り同じバイナリが動く世界
    6
    Program

    View Slide

  8. Motivation
    Microkernel
    ・同じOS、同じアーキテクチャである限り同じバイナリが動く世界
    kernel
    system calls
    タスクスケジューラ
    デバイスドライバ
    ファイルシステム
    user
    タスク生成
    低レベルなメモリ管理
    IPCの仕組み
    Program
    ・アプリケーションに応じて”OS”の機能を容易に切り替えられる世界
    7

    View Slide

  9. Motivation
    Microkernel x WASM
    ・同じOSである限り同じバイナリが動く世界(再コンパイルの必要なし)
    ・アプリケーションに応じて”OS”の機能を容易に切り替えられる世界
    system calls
    タスクスケジューラ
    デバイスドライバ
    ファイルシステム
    user
    Program
    WASM
    8
    kernel
    タスク生成
    低レベルなメモリ管理
    IPCの仕組み
    WASM Runtime

    View Slide

  10. Motivation
    ・WASMはスタックマシンベースの命令セットなのでWASMバイナリは位置独立
    Microkernelのボトルネックを解消しつつ、拡張性に優れたOSを作ることができる!!
    全てをKernel空間で動かせる!!
    さらに…
    仮想メモリが必要ない
    ・WASMを使えば特権命令の禁止、範囲外読み書きの禁止ができる
    9

    View Slide

  11. 概要
    fs
    ・ファイルのopen
    ・ファイルのread
    ・ファイルのclose
    vm
    ・タスクの生成
    ・タスクの削除
    shell
    ・コマンド実行
    WASM Runtime(Kernel)
    low level functions
    WASM
    Program
    Microkernel
    10

    View Slide

  12. 特徴
    ・仮想メモリを持たない
    ・すべてのプログラムがWASMバイナリ
    ・すべてのプログラムがring0で動く
    ・kernelそのものがWASM Runtime
    ・メッセージパッシングの機構を提供
    ・”OS”の機能は全てWASMバイナリとして実現する
    11
    ・Kernelの大部分はHina OS(https://github.com/nuta/microkernel-book)を参考にしている

    View Slide

  13. Demo: “Hello World” on mavis
    13

    View Slide

  14. Demo: “Hello World!” on mavis
    shell fs
    “hello”
    OPEN_FILE_MSG
    OPEN_FILE_REPLY_MSG
    1
    shell fs
    READ_FILE_DATA_MSG
    READ_FILE_DATA_REPLY_MSG
    2
    shell vm
    SPAWN_TASK_MSG
    SPAWN_TASK_REPLY_MSG
    4 hello
    create_vm_task
    shell fs
    CLOSE_FILE_MSG
    CLOSE_FILE_REPLY_MSG
    3
    hello vm
    EXIT_TASK_MSG
    5
    task_destroy
    shell
    DESTROY_TASK_MSG
    ”Hello World!”
    14

    View Slide

  15. 実装: Wasm Runtime
    ・C実装(フルスクラッチ)
    ・アーキテクチャ依存の処理をビルトイン関数として持つ
    ・WASIはサポートしていない
    15

    View Slide

  16. 実装: Wasm Runtime
    ・WASIは抽象度が高い
    Why No WASI Support?
    例) fd_writeを実装するといっても、そもそもファイルシステムがない。
    より低レベルなAPIが適している
    16

    View Slide

  17. 実装: メモリ管理
    palloc: 物理ページを割り当てる
    pfree: 物理ページを開放する
    palloc palloc pfree
    17

    View Slide

  18. 実装: メモリ管理
    malloc:任意サイズのメモリ確保
    heap
    next_paddr
    heap
    paddr
    next_paddr
    18

    View Slide

  19. 実装: メモリ管理
    Why No free?
    ・適切にfreeを呼ぶのは難しい
    ・ヘッダにサイズ情報を追加する必要がある
    ・double free等に対する対策が必要になる
    ・サイズごとにfree-listが必要になる
    ・mallocの処理が複雑になる
    ・そこまでしてメモリをけちる必要ある?
    19

    View Slide

  20. 実装: メッセージパッシング
    ipc_send: 指定したタスクにメッセージを送信
    宛先がipc_receiveを既に呼んでいる
    タスクをブロックして実行を移す
    メッセージをコピーする
    20

    View Slide

  21. 実装: メッセージパッシング
    ipc_receive: 指定したタスクからメッセージを受信
    自分に送信しようとしているタスクを再開
    タスクをブロックして実行を移す
    メッセージを受信
    21

    View Slide

  22. 実装: スケジューリング
    ・FIFO方式
    ・切り替えのタイミングはipc_send, ipc_receiveの呼び出し時(協調的マルチタスク)
    ・タイマ割り込みはない
    22

    View Slide

  23. 実装: スケジューリング
    Why No Timer Interrupt?
    ・kernelで動いているserverは互いに生産者、消費者の関係にある
    ・割り込みがあると共有リソースを操作する際にロックをとる必要がある
    ・すべてがkernel空間で動くのでBig Kernel Lockを実装することが困難
    ・mutexはロック忘れが怖いし、デバッグが地獄
    23

    View Slide

  24. 展望
    Message passing over a network
    24
    Network
    RPC(Remote Procedure Call)
    Application
    Kernel(WASM Runtime)
    Servers
    WASM
    Application
    Kernel(WASM Runtime)
    Servers
    WASM
    ・異なるアーキテクチャを透過的に扱うことができるようになるかも!?

    View Slide