Linux kernel 如何使用eBPF修改用户空间内存?

Linux kernel 如何使用eBPF修改用户空间内存?,linux-kernel,bpf,ebpf,bcc-bpf,Linux Kernel,Bpf,Ebpf,Bcc Bpf,我正在尝试编写一个示例代码,看看它实际上是如何工作的 如前所述 如果一切正常,则输出应为: $ cat foo1 this is foo1 content $ cat foo2 this is foo2 content $ sudo bcc_mangle_open.py & [1] 63453 $ cat foo1 this is foo2 content 我在密件抄送中写了一个示例,如下所示: 从密件抄送导入BPF #定义BPF程序 prog=”“” #包括 #包括 int trac

我正在尝试编写一个示例代码,看看它实际上是如何工作的

如前所述

如果一切正常,则输出应为:

$ cat foo1
this is foo1 content
$ cat foo2
this is foo2 content
$ sudo bcc_mangle_open.py &
[1] 63453
$ cat foo1
this is foo2 content
我在密件抄送中写了一个示例,如下所示:

从密件抄送导入BPF
#定义BPF程序
prog=”“”
#包括
#包括
int trace_条目(结构pt_regs*ctx)
{
char-buf[10];
字符foo2[]=“foo2”;
char*fname=(char*)PT_REGS_PARM1(ctx);
bpf探头读取str(buf、sizeof(buf)、fname);
如果(buf[0]!='f'| | buf[1]!='o'| | buf[2]!='o'| | buf[3]!='1'){
返回0;
}
bpf_probe_write_user(fname,foo2,sizeof(foo2));
返回0;
};
"""
#加载BPF程序
b=BPF(文本=prog)
b、 附上kprobe(“do_sys_open”,fn_name=“trace_entry”)
foo1
的内容应该会更改,但不会更改

我试着用
bpf\u trace\u printk()
打印
fname
甚至
buf
,但我的屏幕上什么也没有

你知道为什么内容没有改变吗

更新-1

正如@Queole所建议的那样

.它成功了..所以我们必须给出
(char*)PT\u REGS\u PARM2(ctx)
,而不是
(char*)PT\u REGS\u PARM1(ctx)
。我得到了输出,但有点奇怪。经过3-4次
cat foo1
之后,内容正在更改

$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo2 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo2 content

这种行为的原因是什么?

您是否可以检查
bpf\u probe\u write\u user
返回的值?如果出现错误,它应该是否定的。你试过阅读第二个参数而不是第一个参数吗?内核中的do_sys_open()似乎得到了文件名。谢谢..它工作了..所以我们必须给出
(char*)PT_REGS_PARM2(ctx)
而不是
(char*)PT_REGS_PARM1(ctx)
。我得到了输出,但有点奇怪。经过3-4次
catfoo1
之后,内容发生了变化。我已经更新了这个问题。你知道为什么会这样吗?我可以复制。在这种情况下,
bpf\u probe\u write\u user()
大部分时间返回
-EFAULT
(-14),表示无法将
foo2
复制到
fname
。到目前为止,我还没有找到解决方法。