在kretprobe/sys_read探测器中,我尝试读取 BPF_MAP_TYPE_ARRAY 中的请求缓冲区(用户空间)。eBPF 验证程序抛出以下错误:
{"error": "field SyscallProbeRetRead: program syscall__probe_ret_read: load program: permission denied: invalid access to map value, value_size=70 off=0 size=16383: R1 min value is outside of the allowed memory range (truncated, 73 line(s) omitted)"}
Run Code Online (Sandbox Code Playgroud)
逻辑:如果 buf_size 大于MAX_MSG_SIZE,那么我们将读取TRACE_PARENT_SIZE或更少(取决于缓冲区的大小)到seventy_bytes_array->data,否则,我们将不会读取任何内容。
#define MAX_MSG_SIZE 16383
#define TRACE_PARENT_SIZE 70
SEC("kretprobe/sys_read")
int syscall__probe_ret_read(struct pt_regs *ctx)
{
size_t buf_size = PT_REGS_RC(ctx);
u64 id = bpf_get_current_pid_tgid();
struct data_args_t *read_args = bpf_map_lookup_elem(&active_read_args_map, &id);
if (read_args)
{
char *buf = read_args->buf; …Run Code Online (Sandbox Code Playgroud) 我可以从文档中确认,如果在 HASH_MAP 上完成,bpf_map_update_elem 是一个原子操作。来源(https://man7.org/linux/man-pages/man2/bpf.2.html)。[引用:map_update_elem() 以原子方式替换现有元素]
我的问题是2倍。
如果元素不存在怎么办,map_update_elem 仍然是原子的吗?
XDP 操作 bpf_map_delete_elem 线程在用户空间程序中安全吗?
该映射是 HASH_MAP。
我一直在阅读有关可休眠 eBPF 程序的内容,特别是这篇文章提供了很好的介绍。然而,我正在努力寻找任何有关如何在代码中实际实现这一目标的文档或示例。非常感谢任何提示或文档链接。