C语言 是否有方法增加ebpf堆栈的大小,得到“错误看起来像是超出了bpf堆栈512字节的限制”,

biswetbf  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(133)

是否有方法增加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个字节,然后在此跟踪中将buf1struct对象共享到用户空间。

dgtucam1

dgtucam11#

我将回答这个问题与更新的信息,为那些发现这通过搜索引擎。
昨天,LLVM基础设施引入了带有-mllvm -bpf-stack-size <stack size>标志的overriding the BPF stack size的可能性。因此,您现在可以使用更大的堆栈编译BPF ELF二进制文件。
但是,为了完整起见,增加的堆栈将不适用于加载到内核中的BPF程序。增加的堆栈大小针对非内核用途。

相关问题