如何使用BPF访问内核变量?
问题描述:
例如,访问skb
变量函数ip_rcv
:如何使用BPF访问内核变量?
int ip_rcv(struct sk_buff *skb, struct net_device *dev,
struct packet_type *pt, struct net_device *orig_dev)
{
...
}
我在网上搜索,但找不到任何例子。
答
使用BPF拦截内核函数的最简单方法可能是使用bcc。它提供了一个更高的层次,Python的API来加载BPF程序内核,并与他们互动:
#!/usr/bin/env python
from bcc import BPF
BPF(text="""
int kprobe__ip_rcv(struct pt_regs *ctx, struct sk_buff *skb) {
bpf_trace_printk("skb=%p!\\n", skb);
return 0;
}
""").trace_print()
返回:
<idle>-0 [007] d.s. 1441.065248: : skb=ffff906b2bd53400!
<idle>-0 [007] d.s. 1442.267325: : skb=ffff906b76c5b700!
<idle>-0 [007] d.s. 1442.993894: : skb=ffff906b42b76800!
<idle>-0 [007] d.s. 1443.194334: : skb=ffff906be925d300!
<idle>-0 [007] d.s. 1444.616469: : skb=ffff906b67e6a200!
欲了解更多信息,请参阅the tutorial在BCC库。
如果您不想使用密件抄送,您可以在Linux内核中找到examples of BPF programs。我特别邀请你看看tracex1_kern/user.c
。