在eBPF程序中有一种神秘的程序类型, 这种程序类型名字叫做, BPF_PROG_TEST_RUN
, 下面就让我们一起来看一下关于这种类型的处理。
//首先设置一个对应的字符串
pb->probe = strdup(pspec->string.data);
pb->provider = provider_get(pb->probe);
//然后根据之前的字符串找到对应的probe provider
err = pb->provider->probe(pb);
然后就是根据对应的probe类型去创建对应的probe,第一步就是load, 我们看一下吧:
/*
对于prog_type: BPF_PROG_TYPE_RAW_TRACEPOINT
对应指令, 这个好像没有啥好说的
*/
pb->bpf_fd = bpf_prog_load(prog_type, insns, n_insns, vlog, vlog_sz);
然后就是对应的attach这个功能了:
err = bpf_prog_test_run(pb->bpf_fd);
if (err)
goto err;
/* read buffer for BEGIN trigger */
if (ply->stdbuf) {
//然后使用, 我们之前介绍的bpf loop
ret = buffer_loop((struct buffer *)ply->stdbuf->priv, 0);
if (ret.exit || ret.err)
return ret;
}
这就是我们大致的流程了