マイクロカーネルOSのひとつ
- はじめにL3があり、そしてL4ができて、さらにそれを形式検証した “SEcured L4” として誕生
- 「マイクロカーネルはIPCが遅い」という言説に反論するためにL3が作られた
- カーネルのリポジトリ (seL4/seL4)
- 検証 (seL4/l4v)
spec/haskell:Haskellによる仕様定義spec/**/*.thy:Isabelle/HOL による形式検証- HOLとは?
- High Order Logic らしい(??)
- First Order Logic なども存在するそう
- Haskellで仕様定義→Isabelleで検証(ここまでl4v)→人間がHaskellの仕様に則ってC言語でカーネルを実装(これがseL4)という感じ?
- HOLとは?
tools/c-parser:SMLで書かれたCのパーサー- 結構デカい(リポジトリの使用言語2位がSMLになるレベル)
- 検証にあたってC言語による実装が正しいかどうか確認するために使ってるのかな(しらんけど)
- docs.sel4.systems
- カーネルオブジェクトとシステムコールの一覧
- CPUアーキテクチャに固有なカーネルオブジェクトも紹介されている
- カーネルオブジェクトとシステムコールの一覧
- 自作OSで学ぶマイクロカーネルの設計と実装でも題材のひとつとなっている
- https://scrapbox.io/horizon2038/seL4
- seL4チュートリアル | ドクセル
- 「ゼロから学ぶRust」や「並行プログラミング入門」の著者である高野氏による解説
capability, CSpace, CNode
https://docs.sel4.systems/Tutorials/capabilities.html
- 何にアクセスできるのかを示すもの(?)
- seL4におけるcapabilityは以下の3つ:
- カーネルオブジェクトへのアクセスを制御するもの
- カーネルオブジェクトはCapabilityによって参照・操作されるもの
- Untyped Memory に対して Retype() を行うことで生成する
- Thread Control Block (TCB) など
- カーネルオブジェクトはCapabilityによって参照・操作されるもの
- 抽象リソースへのアクセスを制御するもの
- IRQControlなど
- カーネルオブジェクトと異なり、メモリ領域に対応するのではなく、カーネルが提供する機能やハードウェア制御の権限を表す
- Untyped capability
- Untyped Memoryを操作するためのcapability
- カーネルオブジェクトへのアクセスを制御するもの
- spec/haskell/src/SEL4/Object/Structures.lhs に capability の定義がある
- 文芸的プログラミングだ……
| 種類 | 用途 |
|---|---|
| ThreadCap | TCBを操作 |
| NullCap | ? |
| NotificationCap | シグナルを操作 |
| IRQHandlerCap | 割り込みハンドラを制御 |
| EndpointCap | IPCを行うためのCapability |
| DomainCap | ? |
| Zombie | ? |
| ArchObjectCap | CPUアーキテクチャに固有なカーネルオブジェクト(x86のPageTableなど)を操作? |
| ReplyCap | |
| UntypedCap | 空メモリへのCapability |
| CNodeCap | CNodeを操作 |
| IRQControlCap | 割り込みを制御 |
- CNode (Capability Node) という配列に格納される
- カーネルオブジェクトの一種
- 前述の
Structures.lhsにおいて、CNodeCapの定義とともにカーネルオブジェクトの中身も書いてある:-
| CNodeCap { capCNodePtr :: PPtr CTE, capCNodeBits :: Int, capCNodeGuard :: Word, capCNodeGuardSize :: Int } CTEは Capability Table EntryGuardはGuardSizeのサイズをもつビットパターン- 後述の
CPtrは先頭がGuardと一致しているらしい
- 後述の
-
- CNodeの、Capabilityが格納される領域のことを CSlot と呼ぶ
- 空であるか、埋まっているかのどちらか(それはそうだろ)
CNodes[0]は慣習として空のままにされているらしい- そんなGDTの0番目 (null descriptor) みたいなことしてうれしいんだろうか
- GDTは歴史があるのでまだ理解できるが(といっても経緯を知らないので同じようなものではある)
- CNodeとCSlotの指定にはCPtrを用いる
Ptrという名前ではあるが、メモリ領域へのポインタではないlibsel4/include/sel4/simple_types.hより:seL4_CNode==seL4_CPtr==seL4_Word==seL4_Uint64- Capability Address Space におけるポインタと考えられる?
- CSpace は、1つ以上の CNode からなる集合(有向グラフ?)
- CSpace内の(CNodeに格納されている)Capabilityにアクセスする(direct addressing)際は、操作対象のCNode・CNodeにおけるCSlotのindex・CNodeをトラバースする際のdepthを指定する
- たとえば
seL4_CNode_Copy()の第1~3引数や4~6引数 - 操作対象の CNode は
seL4_CNodeとなっているが、これはseL4_CPtrと同義 - depthは基本的に
seL4_WordBits- 各archの
constants.hで、主に(sizeof(seL4_Word) * 8)としてdefineされている - RISC-Vとx86_64では
sizeofを用いた式ではなく定数になっている(なんで?)
- 各archの
- たとえば
- CSpaceに対応する構造体があるというより、あるCNodeがrootとなっていて、そこから辿れるCNodeの集合をCSpaceと呼んでいるのか?
seL4_CNode_Copy()の第4引数がseL4_CNode src_rootとなっていることから推測- CNodeにCNodeCapが格納されていれば、そこから「次」のCNodeを辿ることができる
- CSpace内の(CNodeに格納されている)Capabilityにアクセスする(direct addressing)際は、操作対象のCNode・CNodeにおけるCSlotのindex・CNodeをトラバースする際のdepthを指定する
TCB
https://docs.sel4.systems/Tutorials/threads.html
Thread Control Object
- カーネルオブジェクトの一種
- CSpace root と呼ばれるCNode capabilityを持つ
- 空である場合がある
ブート
- 最初に起動するタスクは root task と呼ばれる
- 全てのcapabilityを制御できる
struct BootInnfoをもらえるuntypedListという、Untyped Memory オブジェクトの情報をもつseL4_UntypedDescの配列がある
seL4_Untyped_Retype()によってBootInfo.untypedListの要素を任意のCapability(あるいはobject)に変換していく- sel4-tutorialsのlibsel4tutorials/src/alloc.c にそういう感じの処理が書かれている
libsel4/include/sel4/bootinfo_types.hを並べて読むと良いだろう
- seL4_x86-64でのブート処理