早川さん:言語仕様: ・RISCっぽいISA →64bitの固定長命令 →固定長のスタック →64ビットのレジスタ11本 →ALU,JMP,LD/ST系命令が一通り →Atomic命令、BPF由来のパケットバッファを操作する命令 #kernelvm
2019-07-20 13:09:33→Call命令がある(カーネルの関数が呼べる) ・直接書くのはしんどいのでCで書いてコンパイルする →LLVMのバックエンドがある →CLANGとかでコンパイルしてバイトコードを取り出して、と #kernelvm
2019-07-20 13:10:07言語使用 RISCっぽいISA 64ビット固定長命令 固定長スタック 64ビットレジスタ11本 ALU, JMP, LD/ST等の命令 Atomic明利、BPF由来 call命令 helper functionsと呼ばれるカーネル関数が呼べる 直かくのは大変 Cで書いてコンパイルする LLVMバックエンドがある #kernelvm
2019-07-20 13:10:14早川さん:Cの呼び出し規則に関する工夫: ・JITしたときにc86_64とARM64とコンパチになるように作られている →FFIのオーバーヘッドが少ない #kernelvm
2019-07-20 13:10:53早川さん:Map: ・eBPFとユーザースペースから使えるKVN →Array, Hash, Trie, Queue, Stack, etc... →lookup/update/delete/enqueue/dequeue/peek #kernelvm
2019-07-20 13:11:58Map eBPFとユーザー空間から使えるKVS helper funtionとして呼ぶ ユーザーではbpf(2) ユースケース カウンタ、ルーティングテーブル #kernelvm
2019-07-20 13:11:59eBPFから外の関数を呼ぶ時の呼び出し規則がx86_64と64bit ARMのABIにそのまま対応付けられる仕様になっていて、これらのアーキテクチャでは効率よく関数呼び出しができる、と #kernelvm
2019-07-20 13:12:12早川さん:bpf(2): ・eBPFの仕組み全般を扱うシステムコール ・バイトコードのロードなど…… #kernelvm
2019-07-20 13:12:45・カーネルのVerifierが安全に実行できるか静的に検証する →実行のオーバーヘッドが低い →ループは基本的に禁止 →JMP命令で変なところにとぼうとしていないか? →LD/STで変なところから読み書きしようとしていないか? →などなど #kernelvm
2019-07-20 13:14:17eBPF自体にセキュリティ的な配慮はない Verifier カーネル内で静的なチェックを行う機構 静的なので実行時パフォーマンスは良い チェック内容 ループの禁止 JMPで変なところを呼ばない LD/STで変なところを読まない チェックを通らないとロードすらできない #kernelvm
2019-07-20 13:14:18・チェックが通らなければロードすらもできない ・本当にこれで大丈夫? →賛否両論がある →→Spectre…… #kernelvm
2019-07-20 13:14:58eBPF自体にはセキュリティに対する対処がない(よんではいけない物を呼ぶコード等を表現できる)為、カーネルがeBPFのコードをロードする際に静的な検証を行なっている。eBPFの静的解析に抜けがあるとカーネルの多岐に渡る機能に穴が開く為、その安全性は頻繁に議論になる、と #kernelvm
2019-07-20 13:15:23