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)
- 作者: 養成読本編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2016/08/23
- メディア: 大型本
- この商品を含むブログを見る