ebpf内核模块如果需要有实时事件消息通知用户态程序,就必须使用per_event事件机制。perf是Linux系统提供的一种内核与用户态交互的机制,主要用于内核状态的监视性能分析等。ebpf使用perf机制来进行内核模块与用户态程序的通信,是一种软件perf类型。
ebpf内核模块通过perf_event向用户态程序发送消息,需要使用一种特殊的map:
BPF_MAP_TYPE_PERF_EVENT_ARRAY
该类型的map声明形式为:
struct bpf_map_def SEC("maps") my_perfmap = {
.type = BPF_MAP_TYPE_PERF_EVENT_ARRAY,
.key_size = sizeof(int),
.value_size = sizeof(__u32),
.max_entries = MAX_CPUS,
};
以xdp程序为例,如果xdp程序可以有多个perfmap用于向用户态程序发送不同类型的数据。当然也可以用同一个perfmap发送不同类型的数据,但数据类型定义与用户态程序的处理会稍微复杂一些。
通过perfmap向用户态程序发送perf_event机制的使用流程分为初始化与消息发送接收两个阶段。
perf event的初始化:
首先是初始化阶段,这部分程序在用户态程序中进行,流程为:
1)获取系统中CPU的个数:
numcpus = get_nprocs();
2)获取内核模块中定义的perfmap的mapfd;
这个过程的代码就不贴出来了,主要过程是:</