使用 LIBBPF 编写 API 测试

黎 浩然/ 25 6 月, 2022/ 扩展的伯克利数据包过滤器/EXTENDEDBERKELLEYPACKETFILTER/EBPF, 计算机/COMPUTER/ 0 comments

long bpf_get_current_comm(void *buf, u32 size_of_buf)

使用当前进程名称填充第一个参数地址。 它应该是一个指向至少大小为TASK_COMM_LEN的字符数组的指针,该数组在linux/sched.h中定义(openEuler缺少该定义,应该定义为16)。 例如:

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

#define TASK_COMM_LEN           16

char LICENSE[] SEC("license") = "GPL";

int my_pid = 0;

static __always_inline int is_gopher_comm(void)
{
    char comm[TASK_COMM_LEN] = {0};
    (void)bpf_get_current_comm(&comm, sizeof(comm));
    bpf_printk("%s\\n", comm);
    return 0;
}

SEC("tp/syscalls/sys_enter_write")
int handle_tp(void *ctx)
{
    int pid = bpf_get_current_pid_tgid() >> 32;
    if (pid != my_pid)
        return 0;
    bpf_printk("BPF triggered from PID %d.\\n", pid);
    is_gopher_comm();
    return 0;
}

经过测试发现,__always_inline不是必须的,但是gala-gopher里面的大多数实现使用了这个属性;

运行结果获得进程名称为minimal:

long bpf_probe_read(void *dst, u32 size, const void *unsafe_ptr)

对于跟踪程序,安全地尝试从内核空间地址 unsafe_ptr 并将数据存储在 dst 中。

u64 bpf_ktime_get_ns(void)

返回系统启动后经过的时间,以纳秒为单位。不包括系统暂停的时间。

u32 bpf_get_smp_processor_id(void)

获取 SMP(对称多处理)处理器 ID。 注意所有程序都在禁用抢占的情况下运行,这意味着SMP 处理器 ID 在程序的整个执行过程中都是稳定。

Share this Post

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

*
*