Slide 1

Slide 1 text

Unikernelで 始める⾃作OS October 6, 2019 第17回 ⾃作OSもくもく会 @retrage

Slide 2

Slide 2 text

Q: なぜOS⾃作? 1

Slide 3

Slide 3 text

A: 楽しいから 2

Slide 4

Slide 4 text

A: 学習のため • こういう⼈もいるはず • コンピュータアーキテクチャやOSを知る • 書籍や資料を読んだり • 既存OSの実装を読んだり • 実際に⼿を動かしてみることで理解が深まる 3

Slide 5

Slide 5 text

学習のためのOS⾃作 • 1. ゼロから全部実装 • 全てを⾃分で実装したコードで制御できる • 関⼼のある部分の実装にたどり着くまでが⼤変 • 2. 既存OSの改造 • 関⼼のある部分の実装にすぐ着⼿できる • 既存OSの実装を理解している必要がある • Linuxのような⼤規模なOSの場合かなり⼤変 4

Slide 6

Slide 6 text

OS⾃作の障壁 • x86プラットフォームは⽐較的複雑 • 歴史的経緯による • 煩雑な起動プロセス • 多種多様なデバイスへの対応 • 学習⽤途であれば仮想環境で⼗分では? • デバイス: virtio, シリアルコンソール • OSの起動: -kernel os.img • => Unikernelが使えそう 5

Slide 7

Slide 7 text

Unikernel: 概要 • OSの形態の1つ (Library OS) • 仮想環境で動作す ることを前提 • 空間の分離なし • シングルプロセス • ハイパーバイザで 隔離性を担保 • 実装は多数 6

Slide 8

Slide 8 text

Unikernel: ⾃作OSの観点 • 簡易化したOSとみなせる • 1. ゼロからの実装: • マルチプロセスの実装が不要 • 実装すべきデバイスドライバは少数 • 2. 既存OSの改造: • コード量が⽐較的少ない • 例: Unikraft 108,523⾏ 7

Slide 9

Slide 9 text

Unikernels as Processes • Unikernelをホスト上のプロセスとして動かす • 隔離はOS上のプロセスで⼗分 • Unikernelに対する制約 • システムコールを直接発⾏できない 8

Slide 10

Slide 10 text

ハイパーコール 9

Slide 11

Slide 11 text

Unikernels as Processes: ⾃作OSの観点 • 抽象化されたデバイス • デバイスドライバを書く必要がない • ハイパーコールを発⾏するだけで利⽤可能 • デバッグが⽐較的容易 • ただのユーザ空間のプロセスのため • エミュレータも不要 • => ⾼レイヤーな部分を作るのに最適 10

Slide 12

Slide 12 text

課題点 • 学習を⽬的に設計実装されていない • コードが不親切だったり • コードの説明がなかったり • 汎⽤OSでは必須な機能の実装がない • マルチタスク • ユーザ空間とカーネル空間の分離 • =>どこに興味があるかに依存 11

Slide 13

Slide 13 text

実例 12

Slide 14

Slide 14 text

Unikraft 13

Slide 15

Slide 15 text

Linux Kernel Library 14 • vanillaなLinux Kernelがユーザ空 間で動作 • ホスト固有の コードは綺麗に 分離 • mutex/semaphore /thread/block rw etc. • arch/lkl

Slide 16

Slide 16 text

LKL on Unikraft 15 uk-host.o lkl.o LKL App unikraft_linuxu_x86_64 liblkl LK mutex.o thread.o timer.o

Slide 17

Slide 17 text

LKL on Unikraftデモ 16 $ ./build/boot_linuxu-x86_64 Welcome to _ __ _____ __ _____ (_) /__ _______ _/ _/ /_ / // / _ \/ / '_// __/ _ `/ _/ __/ \_,_/_//_/_/_/\_\/_/ \_,_/_/ \__/ Titan 0.2~51691ea /* snip */ [ 0.000000] Linux version 4.17.0+ ([email protected]) (gcc version 8.1.1 20180712 (Red Hat 8.1.1-5) (GCC)) #1 Thu Jan 10 14:04:16 JST 2019 /* snip */ [ 0.000000] This architecture does not have kernel memory protection. lkl_start_kernel(&lkl_host_ops, "mem=16M loglevel=8") = 0 /* snip */