Open5

eBPFについて

shilvestashilvesta

bpf_trace_printk()は常に/sys/kernel/debug/tracing/trace_pipeという擬似ファイルに出力する

shilvestashilvesta

BPF Map は「クラシックな」BPFには存在しないデータ構造で
ユーザー空間 - eBPFプログラム 間
eBPFプログラム - eBPFプログラム 間
で共有(アクセス)可能

以下にさまざまな種類のBPF Mapが定義されている
https://docs.kernel.org/bpf/maps.html

BPF maps are accessed from user space via the bpf syscall, which provides commands to create maps, lookup elements, update elements and delete elements.

ユーザー空間からはbpfシステムコールで操作できる

shilvestashilvesta

BCC (https://github.com/iovisor/bcc)

  • eBPFプログラムをコンパイル・syscallのイベントにアタッチする便利ツール
  • PythonでeBPFプログラム(C言語風)のコードを書き、C言語に変換する
  • さらにkprobeによってアタッチする

インストール大変だった、、

  • Dockerでうまくインストールできるかと思いきや、MacOS (Apple Silicon) のLinuxkit系のカーネルにlinux-headersが用意されていなく、今回はUTM(https://mac.getutm.app/) でVMを立ち上げて
    Linux(Debian)上で動かした (ケチってクラウドのVMインスタンス使わなかった)
shilvestashilvesta
  • eBPFは仮想マシン上でプログラムをコンパイル・実行している
  • CPUのアーキテクチャに合わせて命令セットとレジスタが設計されている
  • 0 〜 9のレジスタをもつ
shilvestashilvesta
  • Mapはカーネルのメモリ上に常に配置されているため、グローバル変数として利用される
  • Mapは他のプログラムからもアクセス可能