0

目标:每次执行系统调用时打印 Hello。

代码:

_kern.c

#include <linux/bpf.h>
#include "bpf_helpers.h"

SEC("tracepoint/syscalls/sys_enter")
int bpf_sys(struct syscalls_enter_open_args *ctx)
{
        char fmt[] = "Hello\n";
        bpf_trace_printk(fmt, sizeof(fmt));     
        return 0;
}
char _license[] SEC("license") = "GPL";

_user.c

#include <linux/bpf.h>
#include "libbpf.h"
#include <unistd.h>
#include <fcntl.h>

int main(int ac, char **argv)
{
        int prog_fd, fd;
        struct bpf_object *obj;

        if (bpf_prog_load("tracesys_kern.o", BPF_PROG_TYPE_TRACEPOINT,
                          &obj, &prog_fd))
                return 1;

        fd = open("mine_user.c", O_RDONLY);
        close(fd);
        //fork();

        return 0;
}

问题:当我运行程序时,如果调用 open 系统调用,它也会终止而不打印“Hello”。

问题:我错过了什么?我也尝试过 sys_enter_open 而不是 sys_enter

4

1 回答 1

2

至于其他程序类型,加载一个 BPF 程序需要两个步骤。首先是实际加载(将程序从用户空间注入到内核空间,并在其中传递验证程序),bpf_prog_load()在您的情况下执行。然后,程序将附加到 BPF 挂钩之一,这里是一个跟踪点。

在您的示例代码中,您的程序已加载,但尚未附加到跟踪点。bpf_load.c例如,了解如何使用 libbpf加载程序,然后将其附加到跟踪点。

我认为最近版本的 libbpf 现在提供bpf_program__attach_tracepoint()了一种将程序附加到跟踪点的更简单方法。

正如 pchaigno 提到的,您可以列出系统上可用的跟踪点sudo perf list tracepoint(您可能必须安装该perf实用程序)。

于 2019-08-27T12:47:39.767 回答