あらすじ
前回の記事で、以下のような構成要素がBPFプログラムに最低限必要な情報だと結論づけました。
必要なセクション strtab BPFプログラムセクション with 正しい名前 ライセンス symtab 必要なシンボルテーブル BPFプログラムの関数名 ライセンスの場所
今回は実際にバイナリを作ってロードしてみます。
続きを読む前回の記事で、以下のような構成要素がBPFプログラムに最低限必要な情報だと結論づけました。
必要なセクション strtab BPFプログラムセクション with 正しい名前 ライセンス symtab 必要なシンボルテーブル BPFプログラムの関数名 ライセンスの場所
今回は実際にバイナリを作ってロードしてみます。
続きを読む主に9月に開かれる某Kaigiの関係とか、色々があり、C言語以外の言語でBPFバイナリを作ることができないか模索しています*1。某Slackなどで相談させてもらっていますが、こんな感じ(資料後半)。
その予備調査として、BPFバイナリとしてlibbpfが取り扱えるELF形式のバイナリがどのようなものか調べています。
これ、なんかドキュメントがあるような気もせんでもないですが、まあぼく自身ELF形式に詳しくないこともあり実際のファイルを眺めながら調べた結果*2を残しとこうと思います。
*1:Rustならredbpfというものがあります、サンプル見るとクソかっこいい: https://github.com/foniod/redbpf/blob/main/examples/example-probes/src/vfsreadlat/main.rs
*2:調べるプロセス自体を残すことは、後学のためにも悪くないでしょう
タイトルの通り、連休の多くの空き時間を言語実装に費やしてしまった...。
とにかく、スターがついて承認されたいという気持ちが強いです(結論ファースト)。
今のところ、この辺りの機能はできている。
フィボナッチ数を求めるとこんな感じ。 2.4 GHz / 8コア Intel Core i9 のMacで実行した。といってもシングルコアしか使わないのだが。
function dofib(n) if n < 2 then return 1 else return dofib(n-1) + dofib(n-2) end print("Unreachable!\n") end print(dofib(25)) print("\n")
$ time ./target/release/purua lua_examples/fib2.lua 121393 ./target/release/purua lua_examples/fib2.lua 2.12s user 0.01s system 99% cpu 2.132 total ## 比較用 ruby 2.7.1 $ time ruby /tmp/rubyfib.rb 121393 ruby /tmp/rubyfib.rb 0.07s user 0.07s system 56% cpu 0.259 total続きを読む