Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
@udzura 作ったり作ろうとしているものの話 @プログラミング言語処理系が好きな人の集まり 定例ミートアップ #2
Slide 2
Slide 2 text
Uchio Kondo @udzura Rubyist。Rustに爆ハマり中。 低レイヤプログラミングワナビです。 好きなLinuxシステムコール: unshare(2), open_by_handle_at(2)
Slide 3
Slide 3 text
作ってるもの Purua Pure Rust で実装した Lua https://github.com/udzura/purua
Slide 4
Slide 4 text
Purua について PUre-RUst-luA gopher-lua という実装を大きく参考して いる。ただ、今のところVMを実装しておら ず(tree-walkで実行)Opcodeもない そもそも何も分からないので全て手探り
Slide 5
Slide 5 text
動くもの フィボナッチ数の計算 (関数定義、呼び出し、if文だけでこんな に苦しいだなんて)
Slide 6
Slide 6 text
めちゃくちゃ遅い。まあ最適化とかは遠い将来で... Purua (185c5e6e72101342fba08c98307f888f97432269) Ruby (ruby 2.7.1p83 [x86_64-darwin19])
Slide 7
Slide 7 text
動くもの #2 イテレータが動くようになった (えらい) Luaのイテレータの仕様を何も知らな かったので大変だった。
Slide 8
Slide 8 text
動くもの #3 RustからLuaの関数も定義可能になって いる(と言うより先にそっちを書いた)。 Result 使えます! 嬉しくないですか。
Slide 9
Slide 9 text
細かい話はブログに書いていた https://udzura.hatenablog.jp/entry/2021/05/08/150858
Slide 10
Slide 10 text
Puruaの今後 * そもそもLuaと言える状態じゃないので残った機能を頑張って実装。 luatest? というやつが走るようにしたい。 * クロージャの実装が辛そうなので怯えている * そもそも、VMを作りたい。 * LuaのVMはレジスタ型だと聞いて、難しそう... ってなっている。 * crafting interpreterなどを読んでまずはスタック型から...
Slide 11
Slide 11 text
作りたいもの tl;dr C言語以外で書けるeBPFプログラムのコンパイラを作りたい。
Slide 12
Slide 12 text
(e)BPF...って? カーネルで高速にフィルタリングするやつ (雑)。cとeがある。 元々パケットフィルタ用途だが、カーネル の情報なんでもフィルタ集計できるよう に。 カーネル内で動くのでカーネルの機能が 使える。
Slide 13
Slide 13 text
言語・環境としての eBPF * 64bit固定長の命令 * 10個のレジスタがある * R10はフレームポインタ * 512バイトのスタック
Slide 14
Slide 14 text
eBPF の仕様の話は 僕の説明よりmmisonoさんの記事の方がいいと思う 「BPFのアーキテクチャ、命令セット、cBPFとeBPFの違い」 https://www.atmarkit.co.jp/ait/articles/1812/10/news016.html
Slide 15
Slide 15 text
BPF を「使う」には * BCCのような軽量言語向けのSDKを使う場合 * Python, Lua, Ruby(拙作)などある * その場で動的にCコードを生成してコンパイルする感じ * libbpf + CO-RE を使う * C/C++, Go, Rust など、BPFプログラムをバイナリに組み込む * カーネルバージョンに関わらずある程度動かせるように
Slide 16
Slide 16 text
BPF プログラムを「作る」には * C コンパイラの bpf ターゲットを使う。 * Clang $ clang -O1 -g -c -target bpf \ foo.bpf.c -o foo.bpf.o * GCC も対応するようになったらしい
Slide 17
Slide 17 text
BPFプログラムを 動かす例 左のようなCコードを書く。 あるcgroupに所属するプロセスの、デバ イスタイプごとのアクセス可否をフィルタ リングするBPF -target bpf でコンパイルすると dev_cgroup.o ができる
Slide 18
Slide 18 text
コンパイルされた BPFプログラム objdump などで 命令を確認できる 対応する命令を bpf-docsや linux/bpf_common.h, linux/bpf.h などを眺めて確認する
Slide 19
Slide 19 text
No content
Slide 20
Slide 20 text
ロードした結果 cgroupに所属しているときは urandomにアクセスできない cgroupから外れるとできる
Slide 21
Slide 21 text
BPFの現況 カーネル側のBPFプログラムは、実質的 にC言語で書く以外選択肢がない(*) (そのプログラムをロードして情報を取得 する外側については言語を問わない。 libbpfのようなライブラリもある) (*) 選択肢の詳細 https://www.atmarkit.co.jp/ait/articles/1812/26/news010.htm l
Slide 22
Slide 22 text
C以外で書けるようにしたい
Slide 23
Slide 23 text
コンパイラを書く...ってコト❓
Slide 24
Slide 24 text
No content