gpt4 book ai didi

c - 为什么 bpf 代码无法访问 cpumap_enqueue_ctx 的前 8 个字节?

转载 作者:行者123 更新时间:2023-12-05 00:45:19 27 4
gpt4 key购买 nike

阅读一些附加到跟踪点的 ebpf 示例,我注意到每个结构都是从这样的填充开始构建的(来自 samples/bpf/xdp_redirect_cpu_kern.c)

/* Tracepoint: /sys/kernel/debug/tracing/events/xdp/xdp_cpumap_enqueue/format
* Code in: kernel/include/trace/events/xdp.h
*/
struct cpumap_enqueue_ctx {
u64 __pad; // First 8 bytes are not accessible by bpf code
int map_id; // offset:8; size:4; signed:1;
u32 act; // offset:12; size:4; signed:0;
int cpu; // offset:16; size:4; signed:1;
unsigned int drops; // offset:20; size:4; signed:0;
unsigned int processed; // offset:24; size:4; signed:0;
int to_cpu; // offset:28; size:4; signed:1;
};

我发现的只是这个注释,它说 bpf 代码无法访问前 8 个字节,但我不明白为什么。

最佳答案

来自 this mailing list :

The first 8 bytes of the tracepoint context struct are not accessible by the bpf code. This is a choice that dates back to the original inclusion of this code.

See explaination in: commit 98b5c2c65c29 ("perf, bpf: allow bpf programs attach to tracepoints")



来自 commit 98b5c2c65c29 :

introduce BPF_PROG_TYPE_TRACEPOINT program type and allow it to be attached
to the perf tracepoint handler, which will copy the arguments into
the per-cpu buffer and pass it to the bpf program as its first argument.
The layout of the fields can be discovered by doing
'cat /sys/kernel/debug/tracing/events/sched/sched_switch/format'
prior to the compilation of the program with exception that first 8 bytes
are reserved and not accessible to the program. This area is used to store
the pointer to 'struct pt_regs' which some of the bpf helpers will use:
+---------+
| 8 bytes | hidden 'struct pt_regs *' (inaccessible to bpf program)
+---------+
| N bytes | static tracepoint fields defined in tracepoint/format (bpf readonly)
+---------+
| dynamic | __dynamic_array bytes of tracepoint (inaccessible to bpf yet)
+---------+

Not that all of the fields are already dumped to user space via perf ring buffer
and broken application access it directly without consulting tracepoint/format.
Same rule applies here: static tracepoint fields should only be accessed
in a format defined in tracepoint/format. The order of fields and
field sizes are not an ABI.

所以前 8 个字节是不可访问的,因为它们用于存储指向 BPF 助手使用的关键结构的指针,因此需要保持隐藏以防止损坏或信息泄漏。

关于c - 为什么 bpf 代码无法访问 cpumap_enqueue_ctx 的前 8 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57692547/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com