ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

BPFバイナリはどのようなELF形式か(2) - mrubyのDSLを書いたらELFを吐く

あらすじ

udzura.hatenablog.jp

前回の記事で、以下のような構成要素がBPFプログラムに最低限必要な情報だと結論づけました。

    必要なセクション
        strtab
        BPFプログラムセクション with 正しい名前
        ライセンス
        symtab
    必要なシンボルテーブル
        BPFプログラムの関数名
        ライセンスの場所

今回は実際にバイナリを作ってロードしてみます。

続きを読む

BPFバイナリはどのようなELF形式か(1) - 最低限の情報とは?

主に9月に開かれる某Kaigiの関係とか、色々があり、C言語以外の言語でBPFバイナリを作ることができないか模索しています*1。某Slackなどで相談させてもらっていますが、こんな感じ(資料後半)。

docs.google.com

その予備調査として、BPFバイナリとしてlibbpfが取り扱えるELF形式のバイナリがどのようなものか調べています。

これ、なんかドキュメントがあるような気もせんでもないですが、まあぼく自身ELF形式に詳しくないこともあり実際のファイルを眺めながら調べた結果*2を残しとこうと思います。


*1:Rustならredbpfというものがあります、サンプル見るとクソかっこいい: https://github.com/foniod/redbpf/blob/main/examples/example-probes/src/vfsreadlat/main.rs

*2:調べるプロセス自体を残すことは、後学のためにも悪くないでしょう

続きを読む

cgroup v2の、BPFによるデバイスアクセス制御を試す

RubyKaigiも近付いたしeBPFの機運を高めようとしている。

タイトルですが、そういうことができます。

www.kernel.org

このドキュメントにも「どうすればできる」と言うところが書いておらず、最終的にカーネルのサンプルを眺めることになる。

elixir.bootlin.com

elixir.bootlin.com

続きを読む

GWなのでRustでLuaを実装し(ようとし)た話

GWは、ゲートウェイじゃなくゴールデンウィークです。

タイトルの通り、連休の多くの空き時間を言語実装に費やしてしまった...。

github.com

とにかく、スターがついて承認されたいという気持ちが強いです(結論ファースト)。


今のところ、この辺りの機能はできている。

  • 四則演算
  • Rustでの/Luaでのグローバル関数定義
  • 関数内ローカル変数
  • if/then/else文
  • 配列ベースの繰り返し(ただ、配列操作ができない)

フィボナッチ数を求めるとこんな感じ。 2.4 GHz / 8コア Intel Core i9Macで実行した。といってもシングルコアしか使わないのだが。

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
続きを読む