カーネルモジュールを使って少し危険を冒せ eBPF を拡張できるか? どういう拡張が現時点でできる か? どんな時に嬉しいか? どういう拡張が今後ほしくなりそうか? > BPF is a highly flexible and efficient virtual machine-like construct in the Linux kernel allowing to execute bytecode at various hook points in a safe manner. ref. BPF and DP eference Guide 4
KFuncs 定義箇所 printk(KERN_ALERT "hello_const from eBPF (id=%d)", id__k); 関数アノテーション: 引数・戻り値 扱い、全体的な挙動をフラグで渡す return 0; e.g. B F_ID_FLAG (func, bpf_hello, KF_ LEEPABLE, KF_DE C I E) KF_DE} C I E -> CAP_ _BOO ref. v6.12.1/source/include/linux/btf.h#L18-L77 BTF_SET8_START(bpf_task_set) BTF_ID_FLAGS(func, bpf_hello_const) BTF_SET8_END(bpf_task_set) 15
id) __ksym; SEC("tp_btf/sys_enter") int BPF_PROG(sys_enter, struct pt_regs *regs, long syscall_id) { bpf_hello(syscall_id); アノテーションを一致させる必要 bpf_hello_const(200); ない ただ 変数名であって識別子 B F に登録されない return 0; } erifier 検証で カーネルモジュール B F を利用する 25
// .. for _, v := range ds.Vars { switch t := v.Type.(type) { case *btf.Func: ec.kfuncs[t.TypeName()] = t case *btf.Var: ec.ksyms[t.TypeName()] = struct{}{} default: return fmt.Errorf("unexpected variable type in .ksyms: %T", v) } } ref. loadKsyms ection() in cilium/ebpf 30