bccめも:bpf_probe_read()

bpf_probe_read()は3番目の引数を安全に読み出すためのものという認識で間違ってないとは思うけど。

linuxカーネルsamples/bpf/bpf_helpers.hを見ると引数名はunsafe_ptrとかなってるし。strpcyとかだとinvalid opcode的なエラーになったので、この辺を使っておくのが良いのだろう。たぶん。

 18 static int (*bpf_probe_read)(void *dst, int size, void *unsafe_ptr) =
 19         (void *) BPF_FUNC_probe_read;

memo.

#!/usr/bin/env python

from bcc import BPF
import ctypes as ct

prog = """
#include <uapi/linux/ptrace.h>
#include <linux/kernfs.h>

BPF_PERF_OUTPUT(events);

struct cgroup_rmdir_dname {
    char name[256];
};

void kprobe__cgroup_rmdir(struct pt_regs *ctx, struct kernfs_node *kn)
{
        struct cgroup_rmdir_dname crd = {};
        bpf_probe_read(&crd.name, sizeof(crd.name) - 1, (void *) kn->name);
        events.perf_submit(ctx, &crd, sizeof(crd));
}
"""

class CgroupRmdirData(ct.Structure):
    _fields_ = [
        ("name", ct.c_char * 256)
    ]

def print_event(cpu, data, size):
    event = ct.cast(data, ct.POINTER(CgroupRmdirData)).contents
    print("name: %s" % (event.name))

print("Ctrl-c to stop")
b = BPF(text=prog)
b["events"].open_perf_buffer(print_event)
while 1:
    b.kprobe_poll()

こんな感じ。

# mkdir test && rmdir test
# ./cgroup_rmdir.py
Ctrl-c to stop
name: b'test'

改訂3版 Linuxエンジニア養成読本 (Software Design plus)

改訂3版 Linuxエンジニア養成読本 (Software Design plus)