bpf

bpftrace 2020

bpf

(この記事はLinux Advent Calendar 2020 - Qiitaの2日目の記事です.前日はmasami256さんのTiny Core LinuxでLinuxのinitプロセスが実行されるあたりを調べるでした.) みなさんこんにちはこんばんは.bpftraceを使っていますか? (e)BPFといえば最近は専らCi…

macでbpftraceを試す

全然使ってなかったので最近気づいたのですが,いつのまにか Docker for mac で使われている linuxkit のカーネルが 5.4ベースになっていて,BPFの基本的な機能が使えるようになってました(念のため言っておくと,docker for macはLinuxをハイパーバイザ上…

BPF_PROG_TYPE_RAW_TRACEPOINT (raw tracepoint) について

BPFのプログラムタイプの一つにBPF_PROG_TYPE_RAW_TRACEPOINTがあります (commit).これを利用するとtracepointの変換前の引数にアクセスすることができます. 例としてkernel/sched/core.cで定義されるsched_swtich のtracepointを考えます. trace_sched_s…

BPFプログラムからカーネル内のデータ構造にアクセスする方法

kprobeやtracepointなどにアタッチしたBPFプログラムは,BPF_FUNC_probe_read()関数でカーネル内のデータ構造にアクセスすることができます.これはprobe_kernel_read()のラッパーで,もし変な領域にアクセスしようした場合(page faultが発生した場合)は-E…

perf, ftraceのしくみ

Linuxのトレーサーであるperfやftraceのツールの使い方に関する情報は結構ありますが,構造に関してはあまり見つけられなかったため,ここに簡単に調べたことをまとめようかと思います.(ツールの使い方の説明はあんまりしないです.) この文章はLinux 4.1…

SpectreとeBPF

新年早々巷にいろいろと賑わいをもたらしたSpectreとMeltdownですが,Google Project Zero (GPZ)が公表したSpectreの攻撃コード例の中でeBPFが使用されていました. 安全を謳っているものの昨年もいくつか脆弱性が発見されていたので,「またeBPFか」と思っ…

cBPFプログラムをLLVM IRに変換する

最近Linuxでいろいろと大活躍のBPF (Berkeley Packet Filter)には主に2種類あって,一番最初に提唱されlibpcapなどで利用されるcBPF (classic BPF)と,主にLinux内で現在利用されている,cBPFをベースに拡張したeBPF (extended BPF)があります. cBPFのプロ…

LinuxのBPF : (5) eBPFによるLinux Kernel Tracing

eBPFによるカーネルトレース 一番最初に書いた通り,eBPFはLinuxのトレーサとして利用できます. カーネルがeBPFプログラムを実行する場合,BPFインタプリタにctxが渡されます(jit化されている場合も同様です). https://github.com/torvalds/linux/blob/v…

LinuxのBPF : (4) ClangによるeBPFプログラムの作成と,BPF Compiler Collection (BCC)

Clangを利用したeBPFプログラムの作成 eBPFへのコンパイル llvm IRの出力 eBPFアセンブリの出力 eBPFプログラムの出力 カーネルで動作するeBPFプログラムの例 skbuffからのロード eBPF mapの処理 BPF Compiler Collection (BCC) インストール bccによるプロ…

LinuxのBPF : (3) eBPFの基礎

はじめに(注意) extended BPF (eBPF) eBPF map eBPFプログラムの例 eBPFのmapの作成 eBPFプログラムの作成 eBPFフィルタプログラムの利用 setsockoptの挙動 JIT ソース まとめ はじめに(注意) ちょうど一年ぐらい前にLinuxのBPFについて記事を書いていま…