type
status
date
slug
summary
tags
category
icon
password
简单介绍eBPF中map的基本用法以及常用类型
map简介及主要类型
map是eBPF中内核空间与用户空间通信的主要方法,map有许多不同的类型,主要的map类型和相关的文档如下:
BPF_MAP_TYPE_LRU_PERCPU_HASH
下面简要介绍一下BTF风格的map定义,如下所示定义了一个
BPF_MAP_TYPE_ARRAY 类型的map。其中
__uint 和 __type 等为相关的宏,让代码可读性更高。对于map的定义而言,通常只需声明一下四组字段。- map类型
type(__uint) 枚举类型,表示map的类型
- key属性(这两个属性是互斥的,声明一个即可)
key(__type) key的类型key_size(__uint) key的大小
- value属性(这三个属性是互斥的,声明一个即可)
value(__type) value的类型values(__array) 用于在加载过程中填充map的内容(可以用于预填充tail-call map)value_size(__uint) value的大小
- 最大容量
max_entries(__uint) 表示最大容量
常用类型简介
下面介绍一些常用的map以及简单的使用方式,这部分可能会随着接触不断更新。
BPF_MAP_TYPE_HASH
hash map是一种通用的类型,其key和value的结构都没有限定,并且可以使用任意key进行查找。但是key和value组合的size不能够大于
KMALLOC_MAX_SIZE (kernel内存分配起能够分配最大大小),否则会返回 -E2BIG 错误。以下helper function适用于该类型:
BPF_MAP_TYPE_ARRAY
一种通用的映射类型,对值的结构没有任何限制,从0开始索引。
value_size本质上没有限制,但是key_size必须是4,表示uint32
- 同样的,其
value_size的值不应该超过KMALLOC_MAX_SIZE
一下helper funciton适用于该类型:
BPF_MAP_TYPE_PERCPU_HASH/ARRAY
这里注意一下,对于HASH和ARRAY,还有
BPF_MAP_TYPE_PERCPU_HASH 和 BPF_MAP_TYPE_PERCPU_ARRAY 两种类型,这是上述两种类型的变体,这些map包含多个副本,每个副本对应主机上的一个逻辑CPU,这个背景下,有以下的应用场景- 多个CPU的无锁数据处理
- 由于eBPF程序在整个运行过程中始终在同一逻辑CPU上执行,这些map可以用于在尾调用之间传递信息
- 用于存储数据而不计入eBPF程序的栈限制
BPF_MAP_TYPE_PERF_EVENT_ARRAY
该类型可以用来高效的从内核空间向用户空间发送大量数据,其有两种使用方法。
- 允许程序发送任意数据,例如网络流等
- 使用
bpf_perf_event_read和bpf_perf_event_read_valuehelp funciton,允许跟踪程序读取性能计数器
对于这个map,其
max_entries 至少要和逻辑CPU的数量一样大,如果不指定,libbpf中默认会将max_entries设置为系统中cpu个数。以下helper function适用于该类型:
BPF_MAP_TYPE_PROG_ARRAY
用于执行尾调用,允许一个程序调用另一个程序,并将控制流传递给后者(尾调用不会返回到调用点,而是像直接由内核调用一样运行)。
以下helper funciton适用于该类型:
BPF_MAP_TYPE_RINGBUF
用于高效地将大量数据从eBPF程序发送到用户空间。数据按照FIFO方式发送,和per-CPU的形式不同,所有CPU之间事件的顺序被有效保留。
使用上的注意:
- 由于没有key-value对,因此
key_size和value_size属性必须设置为0
max_entries用于指定环形缓冲区大小,必须是2的幂,并且是页面的大小的倍数(即4096的倍数)
- 此映射类型不能使用 map 查找、更新和删除的 BPF 系统调用命令。要从映射中读取数据,用户空间程序必须将环缓冲区的一部分内存映射到其地址空间中(使用
mmap系统调用)
- Author:Patrickhao
- URL:http://preview.tangly1024.com/article/222f3660-cb43-8090-8e1d-fe9507bde2ad
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts
