0

こんにちは、eBPF マップの使用方法を学習しようとしているので、BCC ドキュメントで見つけた簡単なコードを実行しようとしました。

import os
import socket
import time
import logging
import signal
import sys
import zmq
import json
import yaml
import netifaces as ni
from bcc import BPF
from ctypes import *

b = BPF(src_file="tailcall_test.c")
tail_fn = b.load_func("tail_call", BPF.KPROBE)
prog_array = b.get_table("prog_array")
prog_array[c_int(2)] = c_int(tail_fn.fd)
b.attach_kprobe(event="some_kprobe_event", fn_name = "do_tail_call")

そして、これが私が使用したcコードで、名前は :tailcall_test.c です:

#include <uapi/linux/ptrace.h>
#include <net/sock.h>
#include <bcc/proto.h>
#include <linux/bpf.h>
#include <linux/kernel.h>
#include <uapi/linux/bpf.h>

BPF_PROG_ARRAY(prog_array, 10);

int tail_call(void *ctx) {
        bpf_trace_printk("tail-call\n");
        return 0;
}

int do_tail_call(void *ctx) {
        bpf_trace_printk("Original program\n");
        prog_array.call(ctx, 2);
        return 0;
}

どのヘッダーまたはライブラリを含める必要があるのか​​ よくわからなかったので、そこにすべてをダンプしました..汚れたコードについて申し訳ありません:(

とにかく、実行しようとすると次のエラーが表示されます。

cannot attach kprobe, probe entry may not exist
Traceback (most recent call last):
  File "tailcall_test.py", line 18, in <module>
    b.attach_kprobe(event="some_kprobe_event", fn_name = "do_tail_call")
  File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 648, in attach_kprobe
    (fn_name, event))
Exception: Failed to attach BPF program do_tail_call to kprobe some_kprobe_event

何か助け..? よろしくお願いします。

さらに、eBPF テール コールの使用方法を学ぶために確認すべき推奨事項があれば、それを共有していただければ幸いです。

よろしくお願いします。

4

1 に答える 1

1

そのため、Roadowl がコメントで問題の原因を見つける前に、回答を入力し終える時間がありませんでした :)。テール コールの参照に関する質問の 2 番目の部分がありましたが、とにかくそのビットを書いたので、参考になる場合に備えて投稿します。

  • 将来の参考のために、bcc のドキュメントには末尾の呼び出しに関する段落がありますが、コードを見ると既に見つかりました :)。

  • 末尾呼び出しがどのように機能するかを理解したい場合は、Cilium のドキュメント、特に末尾呼び出しに関するセクションを参照することをお勧めします。.call()bcc は、Cilium のドキュメントではカバーされないラッパー (関数など) を提供することに注意してください。

  • bcc 自体はテール コールをあまり使用していないようですが、それを使用していると思われるネットワークの例を 1 つしか見つけられませんでした (徹底的に検索しませんでしたが)。

  • iproute2 リポジトリで、テール コールを使用したいくつかの簡単なサンプル プログラムを見つけることができます (単純なものループするもの)。カーネルサンプルまたはセルフテストでもいくつか見つけることができます: grep for tail_call.

于 2019-06-30T22:45:09.440 に答える