嗨,我正在尝试学习如何使用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尾部呼叫,那么如果您能与我分享它们,我将非常感谢。
非常感谢。
答案 0 :(得分:1)
因此,在Roadowl在评论中找到问题的原因之前,我没有时间完成我的答案的输入:)。由于问题的第二部分涉及到有关尾部调用的引用,并且无论如何我都写了这一点,因此我将其发布以防万一。
仅供参考,密件抄送文档中有a paragraph on tail calls,但是从您的代码看来,您已经找到了它:)。
如果您想了解尾部调用的工作原理,建议您阅读Cilium的文档,尤其是the section on tail calls。请记住,密件抄送提供了一些包装器(例如.call()
函数),这些包装器不会在Cilium的文档中介绍,但无论如何它应该可以帮助您了解幕后发生的事情。
密件抄送本身似乎并没有使用太多的尾部调用,我只能找到似乎正在使用尾部调用的one networking example(尽管我没有彻底搜索)。
您可以在iproute2存储库(simple one,one that loops)中使用尾部调用找到一些简单的示例程序。您还可以在内核samples或selftests中找到一些:tail_call
的grep。