使用 LIBBPF 编写 API 测试
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 在程序的整个执行过程中都是稳定。