是否有方法增加eBPF堆栈大小的大小?我得到Looks like the BPF stack limit of 512 bytes is exceeded. Please move large on stack variables into BPF per-cpu array map.
错误。是否有eBPF帮助函数或命令,我可以用来增加堆栈的大小,所以我不会得到这个错误
在这个页面上,它是这样说的,但它是在一段时间前发布的;我想知道是否有任何工作围绕这个限制:
目前,没有。堆栈大小限制为512字节,bpf程序中也没有kmalloc风格的动态分配。一种方法是使用值大小为4k的per-cpu map,并填写4k map值并将其与map值一起提交。但我以前从未尝试过这种方法。
这是我的eBPF程序
struct {
__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
__type(key, long);
__type(value, long);
__uint(max_entries, 1024);
} tcp_map SEC(".maps");
struct buffer2
{
char buffer[1024];
};
SEC("kprobe/__sys_sendto")
int bpf_prog3(struct pt_regs *ctx)
{
char buf[300];
struct buffer2 buf1;
int fd = (int)PT_REGS_PARM1(ctx);
//cha ptr=(char *)PT_REGS_PARM2(ctx);
//char *buffer=(char *)ptr;
bpf_probe_read(buf1.buffer,1023,(void *)PT_REGS_PARM2(ctx));
bpf_trace_printk("[fd = %d]\n",sizeof("[fd = %d]\n"),fd);
bpf_trace_printk("[buffer = %x]\n",sizeof("[buffer = %x]\n"),buf);
long ptr3=PT_REGS_PARM3(ctx);
if(ptr3>0)
bpf_trace_printk("***********************************************\n",sizeof("***********************************************\n"));
bpf_trace_printk("[count = %ld]\n",sizeof("[count = %d]\n"),ptr3);
long *value;
value = bpf_map_lookup_elem(&tcp_map, buf1.buffer);
bpf_map_update_elem(&tcp_map, 0, &buf1, BPF_ANY);
}
我喜欢使用bpf_probe_read(buf1.buffer,1023,(void *)PT_REGS_PARM2(ctx))
从函数参数2中读取1024个字节,然后在此跟踪中将buf1
struct
对象共享到用户空间。
1条答案
按热度按时间dgtucam11#
我将回答这个问题与更新的信息,为那些发现这通过搜索引擎。
昨天,LLVM基础设施引入了带有
-mllvm -bpf-stack-size <stack size>
标志的overriding the BPF stack size的可能性。因此,您现在可以使用更大的堆栈编译BPF ELF二进制文件。但是,为了完整起见,增加的堆栈将不适用于加载到内核中的BPF程序。增加的堆栈大小针对非内核用途。