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