4章 bfp() システムコール

序章

bfp()とは

bpf()は extended BPF Mapまたはプログラムに対してコマンドを実行するために使う

bfp()のシグネチャ

int bpf(int cmd, union bpf_attr *attr, unsigned int size);

たくさんの種類のコマンドが存在し、eBPFプログラムやMapを操作するために使われます。

ユーザ空間とのやりとり

サンプルプログラムの説明

  • configという名前のMap作成
    BPF_HASH(config, u32, struct user_msg_t);

  • outputという名前のPerfリングバッファを作成
    BPF_PERF_OUTPUT(output);

  • Mapに保存される型のポインタを定義
    struct user_msg_t *p;

  • eBPFのヘルパ関数でuidを取得
    data.uid = bpf_get_current_uid_gid() & 0xFFFFFFFF;

  • ユーザIDをキーとしてエントリを検索
    p = config.lookup(&data.uid);

  • Mapから読み出す
    bpf_probe_read_kernel(&data.message, sizeof(data.message), p->message);

  • Perfリングバッファに書き出す
    output.perf_submit(ctx, &data, sizeof(data));


straceでシステムコールを見る

$ strace -e bpf ./hello-buffer-config.py
bpf(BPF_BTF_LOAD, ...) = 3
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_PERF_EVENT_ARRAY…) = 4
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_HASH...) = 5
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_KPROBE,...prog_name="hello",...) = 6
bpf(BPF_MAP_UPDATE_ELEM, ...}
...

4.1 BTFのデータのロード

BTF(BPF Type Format)とは

BTFによって、eBPFプログラムを複数のバージョンのカーネルで動作させ られるようになります。つまり、eBPFプログラムをコンパイルしたマシンとターゲットマシンで カーネル内部のデータ構造が変わっていてもeBPFプログラムを動作させる方法が存在するという ことです。

※2 BTFはカーネルv5.1からサポートされるようになった。ただしIO Visor(https://oreil.ly/LjcPN)で議論されているよう に、Linuxディストリビューションによっては、そのディストリビューションが使っているv5.1より前の古いカーネルにBTF のサポートをバックポートしている。

bpf()システムコールの説明 - 1

bpf(BPF_BTF_LOAD, {btf="\237\353\1\0...}, 128) = 3

  • BTFをカーネルに読みだしていて、そのファイル記述子が3

BPF_BTF_LOAD
  Description
  …
    The btf parameter must point to valid memory providing btf_size bytes of BTF binary metadata.

eBPF Syscall — The Linux Kernel documentation

4.2 Mapの作成

bpf()システムコールの説明 - 2

bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_PERF_EVENT_ARRAY, , key_size=4, value_size=4, max_entries=4, ... map_name="output", ...}, 128) = 4

bpf()システムコールの説明 - 3

bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_HASH, key_size=4, value_size=12, max_entries=10240... map_name="config", ...btf_fd=3,...}, 128) = 5

  • MapのタイプはHASH

  • ファイル記述子3のBTFを渡す

4.3 プログラムのロード

bpf()システムコールの説明 - 4

bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_KPROBE, insn_cnt=44, insns=0xffffa836abe8, license="GPL", ... prog_name="hello", ... expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3,...}, 128) = 6

  • eBPFプログラムをカーネルに読み出す

  • kprobeへのアタッチを示すプログラムタイプ

  • insn_cntはeBPFプログラムのバイトコードの命令数、insnsで指定したメモリに保存

  • licenseはGPL、GPLライセンスのBPFヘルパ関数が使える

  • BPF_CGROUP_INET_INGRESSはただのデフォルト値で意味無し

  • ファイル記述子3のBTFデータを使う


4.4 Mapをユーザ空間から操作する

bpf()システムコールの説明 - 5

(Pythonのユーザ空間のコードがMapに文字列を設定)
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=5, key=0xffffa7842490, value=0xffffa7a2b410, flags=BPF_ANY}, 128) = 0

  • Map内のエントリを更新

  • 対象のMapのファイル記述子は5

  • BPF_ANYはキーがなくともエントリを作成

※ファイル記述子はプロセスごとに割り当てられるものなので、別のプロセスでは同じ記述子でも別のものになりえる

bpf_toolで表示

bpf_toolでMapのkay/valueの値を表示できる

$ bpftool map dump name config
[{ "key": 0, "value": { "message": "Hey root!"} },{ … }]

bpftoolはBTFを利用して構造体の型を知る

イベントへのアタッチ方法

アタッチ方法はイベントによって異なり、bpf()システムコールを使わない場合もある (e.g. kprobeへのアタッチ)

4.5 BPFプログラムとMapへの参照

参照カウント

カーネルは、プロセスが終了すると使用しているファイル記述子を解法し、プログラムへの参照カウントを減らします。BPFプログラムへの参照が1つもなくなったときに、カーネルはプログラムを削除します。

ピン留め

ピン留め(ピンニング)すると明示的に参照を1つ増やせます。
bpftoolがピン留めをせずにプログラムを読み出したとすると、コマンド実行の意味がなくなり ます。なぜならbpftoolコマンドが終了したらファイル記述子は解放され、参照がゼロになってプ ログラムが削除されるからです。

参照カウンタはBPFプログラムがそれをトリガーするフックにアタッチされたときにも同じく 増加します。この参照カウンタの振る舞いはBPFプログラムタイプによって異なります。

In summary: xdp, tc, lwt, cgroup hooks are “global”, whereas kprobe, uprobe, tracepoint, perf_event, raw_tracepoint, socket filters, so_reuseport hooks are “local” to the process, since they're accessed via FD.

Lifetime of BPF objects · BPF (facebookmicrosites.github.io)

eBPF Mapにも参照カウンタがあり、これらも参照カウントがゼロになったら削除されます。参 照カウントは、Mapを使うeBPFプログラムがロードされるときや、ユーザ空間のプログラムが Mapへのファイル記述子を取得したときに増えます。

eBPFプログラムは、プログラムからは参照していないMapを定義することがあります。このよ うなMapの用途としては、例えばプログラムに関する何らかのメタデータを保存したい場合があ ります。メタデータ領域はグローバル変数として定義してMapの中に保存して、かつ、bpf(BPF_ PROG_BIND_MAP)システムコールコマンドによってこのMapをプログラムに結びつけておきます。こうすると、ユーザ空間のプログラムが終了してMapを参照しているファイル記述子が消えても メタデータを保持するMapは削除されません。4

BPF Link

BPF Linkは、eBPFプログラムとアタッチ対象のイベントとの間に抽象レイヤを作ります。 BPF Link自体もファイルシステムにピン留めができ、プログラムへの追加の参照を作成します。

4.6 eBPFに関係する他のシステムコール

bpf()システムコールの説明 - 5

bpf(BPF_MAP_UPDATE_ELEM, {map_fd=4, key=0xffffa7842490, value=0xffffa7a2b410, flags=BPF_ANY}, 128) = 0

  • ファイル記述子4(Perfリングバッファ)を更新

関連するのはbpf()システムコールだけではない。

$ strace -e bpf,perf_event_open,ioctl,ppoll ./hello-buffer-config.py

他のシステムコールの説明 - 1

perf_event_open({type=0x6 /* PERF_TYPE_??? */, ...},...) = 7

  • type=6はkprobeイベントにアタッチしたことを示す

  • ファイル記述子7はkprobeのPerイベント

$ for i in $(ls /sys/bus/event_source/devices/*/type); do echo $i; cat $i; done
/sys/bus/event_source/devices/breakpoint/type
5
/sys/bus/event_source/devices/cpu/type
4
/sys/bus/event_source/devices/kprobe/type
6
/sys/bus/event_source/devices/msr/type
8
/sys/bus/event_source/devices/software/type
1
/sys/bus/event_source/devices/tracepoint/type
2
/sys/bus/event_source/devices/uprobe/type
7

他のシステムコールの説明 - 2

ioctl(7, PERF_EVENT_IOC_SET_BPF, 6) = 0

  • ファイル記述子6(BPFプログラム)をファイル記述子7(kprobeイベント)にアタッチする

他のシステムコールの説明 - 3

ioctl(7, PERF_EVENT_IOC_ENABLE, 0) = 0

  • ファイル記述子7(kprobeイベント)を有効にする

他のシステムコールの説明 - 4

perf_event_open({type=PERF_TYPE_SOFTWARE, size=0 /* PERF_ATTR_SIZE_??? */, config=PERF_COUNT_SW_BPF_OUTPUT, ...}, -1, X, -1, PERF_FLAG_FD_CLOEXEC) = Y

int syscall(SYS_perf_event_open, struct perf_event_attr *attr,
pid_t pid, int cpu, int group_fd, unsigned long flags);

perf_event_open(2) - Linux manual page (man7.org)

4回発生しているシステムコールは、4つのCPUにそれぞれ存在するリングバッファに対応している。

他のシステムコールの説明 - 5

ppoll([{fd=8, events=POLLIN}, {fd=9, events=POLLIN}, {fd=10, events=POLLIN}, {fd=11, events=POLLIN}], 4, NULL, NULL, 0) = 1 ([{fd=8, revents=POLLIN}])

  • 複数のファイル記述子に対してブロックして待ち受ける

  • いずれかのPerfリングバッファに書き込まれるとブロックが解除される

4.7 BPFリングバッファ

Prefリングバッファと比較して:

  • 性能が良い

  • v5.8以上で利用可能

  • すべてのCPUコアで共有される1つの領域しかない(別のCPUから送信された場合もデータの受け取り順序を保証できる)

※実装の変更点としては s/perf/ringbuf/g, s/PERF/RINGBUG/gすれば良さげ

outputリングバッファを作成するbpf()システムコールの呼び出しは次のようになります。

bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_RINGBUF, key_size=0, value_size=0, max_entries=4096, ... map_name="output", ...}, 128) = 4

strace出力における大きな違いは、perf_event_open()、ioctl()そしてbpf(BPF_MAP_UPDATE_ ELEM)を連続で4回呼び出している箇所がなくなったことです。BPFリングバッファの場合はバッ ファ数が1つのため、このような違いが生じています。

本書執筆時点ではBCCはPerfリングバッファの待ち受けにはppollを使っていますが、BPFリ ングバッファからのデータの待ち受けには、より新しいepollベースの方法を使っています。

他のシステムコールの説明 - 6

epoll_create1(EPOLL_CLOEXEC) = 8
epoll_ctl(8, EPOLL_CTL_ADD, 4, {events=EPOLLIN, data={u32=0, u64=0}}) = 0
epoll_pwait(8, [{events=EPOLLIN, data={u32=0, u64=0}}], 1, -1, NULL, 8) = 1

  • epollインスタンスを作成

  • Output用のバッファ(BFPリングバッファ)のファイル記述子4を指定

  • バッファ内部でデータが読み出せるようになるまでブロック

4.8 Mapからの情報の読み出し

bpftoolのbfp()システムコールの呼び出しを確認

$ strace -e bpf bpftool map dump name config
...
bpf(BPF_MAP_GET_NEXT_ID, {start_id=0,...}, 12) = 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=48...}, 12) = 3
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=3, ...}}, 16) = 0

bpf(BPF_MAP_GET_NEXT_ID, {start_id=48, ...}, 12) = 0
...
  • start_idで指定したものの次に来るMapのIDを取得

  • 取得したMap IDに対応するファイル記述子を返却

  • オブジェクト(Map)に関する情報を取得

    • BTFも含まれる

3.6 BPF_OBJ_GET_INFO_BY_FD
Once a program/map fd is acquired, an introspection tool can get the detailed information from kernel about this fd, some of which are BTF-related. For example, bpf_map_info returns btf_id and key/value type ids. bpf_prog_info returns btf_id, func_info, and line info for translated bpf byte codes, and jited_line_info.

BPF Type Format (BTF) — The Linux Kernel documentation

これらをBPF_MAP_GET_NEXT_IDがENOENTを返すまで繰り返す。(同じ名前のMapが複数存在し得る)

Mapの要素の読み出しを確認

bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=NULL, next_key=0xaaaaf7a63960}, 24) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0xaaaaf7a63960, value=0xaaaaf7a63980, flags=BPF_ANY}, 32) = 0
[{ "key": 0, "value": { "message": "Hey root!" }
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0xaaaaf7a63960, next_key=0xaaaaf7a63960}, 24) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0xaaaaf7a63960, value=0xaaaaf7a63980, flags=BPF_ANY}, 32) = 0
},{ "key": 501, "value": { "message": "Hi user 501!" }
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0xaaaaf7a63960, next_key=0xaaaaf7a63960}, 24) = -1 ENOENT (No such file or directory)
} ]
  • Map内のキーを走査する

4.9 まとめ

4.10 演習

bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_KPROBE, insn_cnt=44, insns=0x7fdd11558ba8, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(5, 15, 153), prog_flags=0, prog_name="hello", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=3, func_info_rec_size=8, func_info=0x27ec600, func_info_cnt=1, line_info_rec_size=16, line_info=0x28e0e80, line_info_cnt=21, attach_btf_id=0, attach_prog_fd=0}, 120) = 6

• insns is an array of struct bpf_insn instructions.
• insn_cnt is the number of instructions in the program referred to by insns.

bpf(2) - Linux manual page (man7.org)
struct bpf_insn {
    __u8 code; /* opcode */
    __u8 dst_reg:4; /* dest register */
    __u8 src_reg:4; /* source register */
    __s16 off; /* signed offset */
    __s32 imm; /* signed immediate constant */
};

64 bits = 8 bytes
44 * 8 = 352 bytes

root@yujipc:/home/yuji#+ bpftool prog list
14: kprobe  name hello  tag 2b77904d73f76a56  gpl
loaded_at 2024-06-25T18:52:30+0900  uid 0
xlated 368B  jited 206B  memlock 4096B  map_ids 18,17
btf_id 16

xlated 368B
16 bytes どこいった?

2.


root@yujipc:/home/yuji# bpftool map dump name config
[{
        "id": 20,
        "type": "hash",
        "name": "config",
        "flags": 0,
        "elements": [{
                "key": 0,
                "value": {
                    "message": "Hey root!"
                }
            },{
                "key": 501,
                "value": {
                    "message": [72,105,32,117,115,101,114,32,53,48,49,33
                    ]
                }
            }
        ]
    },{
        "id": 22,
        "type": "hash",
        "name": "config",
        "flags": 0,
        "elements": [{
                "key": 501,
                "value": {
                    "message": [72,105,32,117,115,101,114,32,53,48,49,33
                    ]
                }
            },{
                "key": 0,
                "value": {
                    "message": "Hey root!"
                }
            }
        ]
    }
]
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=NULL, next_key=0x56022375d6f0}, 128) = 0
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=4, key=NULL, next_key=0x56022375d710}, 128) = 0

Mapを検索している行

bpf(BPF_MAP_GET_NEXT_ID, {start_id=0, next_id=0, open_flags=0}, 128) = 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=23, next_id=0, open_flags=0}, 128) = 3
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=3, info_len=80, info=0x7ffd595d0cb0}}, 128) = 0
bpf(BPF_MAP_GET_NEXT_ID, {start_id=23, next_id=0, open_flags=0}, 128) = 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=24, next_id=0, open_flags=0}, 128) = 3
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=3, info_len=80, info=0x7ffd595d0cb0}}, 128) = 0
bpf(BPF_MAP_GET_NEXT_ID, {start_id=24, next_id=0, open_flags=0}, 128) = 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=27, next_id=0, open_flags=0}, 128) = 4
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=4, info_len=80, info=0x7ffd595d0cb0}}, 128) = 0
bpf(BPF_MAP_GET_NEXT_ID, {start_id=27, next_id=0, open_flags=0}, 128) = 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=28, next_id=0, open_flags=0}, 128) = 4
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=4, info_len=80, info=0x7ffd595d0cb0}}, 128) = 0
bpf(BPF_MAP_GET_NEXT_ID, {start_id=28, next_id=0, open_flags=0}, 128) = -1 ENOENT (No such file or directory)

Mapからエントリを取り出している行

bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=5, info_len=32, info=0x7ffd595d0ca0}}, 128) = 0
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=5, info_len=32, info=0x7ffd595d0ca0}}, 128) = 0
[{
        "id": 24,
        "type": "hash",
        "name": "config",
        "flags": 0,
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=NULL, next_key=0x56022375d6f0}, 128) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0x56022375d6f0, value=0x56022375d710, flags=BPF_ANY}, 128) = 0
        "elements": [{
                "key": 0,
                "value": {
                    "message": "Hey root!"
                }
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0x56022375d6f0, next_key=0x56022375d6f0}, 128) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0x56022375d6f0, value=0x56022375d710, flags=BPF_ANY}, 128) = 0
            },{
                "key": 501,
                "value": {
                    "message": [72,105,32,117,115,101,114,32,53,48,49,33
                    ]
                }
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0x56022375d6f0, next_key=0x56022375d6f0}, 128) = -1 ENOENT (No such file or directory)
            }
        ]

3.

root@yujipc:/home/yuji# bpftool map dump name config
[{
        "key": 0,
        "value": {
            "message": "Hey root!"
        }
    },{
        "key": 501,
        "value": {
            "message": [72,105,32,117,115,101,114,32,53,48,49,33
            ]
        }
    }
]
root@yujipc:/home/yuji# bpftool map update name config key 0 0 0 0 value 72 65 32 72 65 32 72 65 32 72 65 0
root@yujipc:/home/yuji# bpftool map dump name config
[{
        "key": 0,
        "value": {
            "message": "HA HA HA HA"
        }
    },{
        "key": 501,
        "value": {
            "message": [72,105,32,117,115,101,114,32,53,48,49,33
            ]
        }
    }
]

4.

root@yujipc:/home/yuji# ps aux | grep hello
root     25892  9.6  1.0 106332 79272 pts/0    S+   21:25   0:00 python3 hello-buffer-config.py
root     25894  0.0  0.0   8168   716 pts/1    S+   21:25   0:00 grep --color=auto hello
root@yujipc:/home/yuji# bpftool prog list
23: kprobe  name hello  tag 2b77904d73f76a56  gpl
        loaded_at 2024-06-25T21:25:43+0900  uid 0
        xlated 368B  jited 206B  memlock 4096B  map_ids 36,35
        btf_id 25
root@yujipc:/home/yuji# bpftool prog pin name hello /sys/fs/bpf/hi
root@yujipc:/home/yuji# cat /sys/fs/bpf/hi
cat: /sys/fs/bpf/hi: Input/output error
root@yujipc:/home/yuji# file /sys/fs/bpf/hi
/sys/fs/bpf/hi: empty

root@yujipc:/home/yuji# ps aux | grep hello
root     25902  0.0  0.0   8168   644 pts/1    S+   21:26   0:00 grep --color=auto hello
root@yujipc:/home/yuji# bpftool prog list
23: kprobe  name hello  tag 2b77904d73f76a56  gpl
        loaded_at 2024-06-25T21:25:43+0900  uid 0
        xlated 368B  jited 206B  memlock 4096B  map_ids 36,35
        btf_id 25
root@yujipc:/home/yuji# rm /sys/fs/bpf/hi
root@yujipc:/home/yuji# bpftool prog list
root@yujipc:/home/yuji#

5.

# diff -u hello-buffer-config.py hello-buffer-config-rawtracepoint.py
--- hello-buffer-config.py      2024-06-23 17:05:27.346030135 +0900
+++ hello-buffer-config-rawtracepoint.py        2024-06-25 22:34:42.597282827 +0900
@@ -19,7 +19,7 @@
    char message[12];
 };

-int hello(void *ctx) {
+RAW_TRACEPOINT_PROBE(sys_enter){
    struct data_t data = {};
    struct user_msg_t *p;
    char message[12] = "Hello World";
@@ -44,7 +44,7 @@

 b = BPF(text=program)
 syscall = b.get_syscall_fnname("execve")
-b.attach_kprobe(event=syscall, fn_name="hello")
+#b.attach_kprobe(event=syscall, fn_name="hello")
 b["config"][ct.c_int(0)] = ct.create_string_buffer(b"Hey root!")
 b["config"][ct.c_int(501)] = ct.create_string_buffer(b"Hi user 501!")
bpf(BPF_RAW_TRACEPOINT_OPEN, {raw_tracepoint={name="sys_enter", prog_fd=6}}, 120) = 7


6.

root@yujipc:/home/yuji# bpftool link list
9: type 7  prog 82
10: type 7  prog 84
11: type 7  prog 85
12: type 7  prog 86
root@yujipc:/home/yuji# bpftool prog list
82: tracepoint  name tracepoint__sys  tag 9f196d70d0c1964b  gpl
        loaded_at 2024-06-25T23:31:41+0900  uid 0
        xlated 248B  jited 144B  memlock 4096B  map_ids 87,84
        btf_id 55
84: tracepoint  name tracepoint__sys  tag 47b06acd3f9a5527  gpl
        loaded_at 2024-06-25T23:31:41+0900  uid 0
        xlated 248B  jited 144B  memlock 4096B  map_ids 87,84
        btf_id 55
85: tracepoint  name tracepoint__sys  tag 37f628f9e857b071  gpl
        loaded_at 2024-06-25T23:31:41+0900  uid 0
        xlated 792B  jited 549B  memlock 4096B  map_ids 84,87,85
        btf_id 55
86: tracepoint  name tracepoint__sys  tag 37f628f9e857b071  gpl
        loaded_at 2024-06-25T23:31:41+0900  uid 0
        xlated 792B  jited 549B  memlock 4096B  map_ids 84,87,85
        btf_id 55

7.

root@yujipc:/home/yuji# bpftool link list
13: type 7  prog 93
14: type 7  prog 95
15: type 7  prog 96
16: type 7  prog 97
root@yujipc:/home/yuji# bpftool prog list
93: tracepoint  name tracepoint__sys  tag 9f196d70d0c1964b  gpl
        loaded_at 2024-06-25T23:43:15+0900  uid 0
        xlated 248B  jited 144B  memlock 4096B  map_ids 93,90
        btf_id 61
95: tracepoint  name tracepoint__sys  tag 47b06acd3f9a5527  gpl
        loaded_at 2024-06-25T23:43:15+0900  uid 0
        xlated 248B  jited 144B  memlock 4096B  map_ids 93,90
        btf_id 61
96: tracepoint  name tracepoint__sys  tag 37f628f9e857b071  gpl
        loaded_at 2024-06-25T23:43:15+0900  uid 0
        xlated 792B  jited 549B  memlock 4096B  map_ids 90,93,91
        btf_id 61
97: tracepoint  name tracepoint__sys  tag 37f628f9e857b071  gpl
        loaded_at 2024-06-25T23:43:15+0900  uid 0
        xlated 792B  jited 549B  memlock 4096B  map_ids 90,93,91
        btf_id 61
root@yujipc:/home/yuji# bpftool link pin id 15 /sys/fs/bpf/mylink
root@yujipc:/home/yuji# ps aux | grep opensnoop
root     30975  0.1  0.0   7280  2320 pts/0    R+   23:43   0:00 ./opensnoop
root     30984  0.0  0.0   8168   648 pts/2    S+   23:45   0:00 grep --color=auto opensnoop
root@yujipc:/home/yuji# ps aux | grep opensnoop
root     30988  0.0  0.0   8168   656 pts/2    S+   23:46   0:00 grep --color=auto opensnoop
root@yujipc:/home/yuji# bpftool prog list
96: tracepoint  name tracepoint__sys  tag 37f628f9e857b071  gpl
        loaded_at 2024-06-25T23:43:15+0900  uid 0
        xlated 792B  jited 549B  memlock 4096B  map_ids 90,93,91
        btf_id 61


8.


リファレンス


この記事が気に入ったらサポートをしてみませんか?