ebpf 实例
来源:互联网 发布:大数据框架hadoop 编辑:程序博客网 时间:2024/05/21 17:54
ebpf的全程是enhancement to berkeley packet filter。网上介绍的资料有很多,举个例子。
ebpf的code 都分成user space 和 kernel space的两部分,在/samples/bpf 路径下有很多例子
我以其中的一个为例
首先看kernel 部分
SEC("kprobe/__netif_receive_skb_core")
int bpf_prog1(struct pt_regs *ctx)
{
/* attaches to kprobe netif_receive_skb,
* looks for packets on loobpack device and prints them
*/
char devname[IFNAMSIZ];
struct net_device *dev;
struct sk_buff *skb;
int len;
/* non-portable! works for the given kernel only */
skb = (struct sk_buff *) PT_REGS_PARM1(ctx);
dev = _(skb->dev);
len = _(skb->len);
bpf_probe_read(devname, sizeof(devname), dev->name);
if (devname[0] == 'l' && devname[1] == 'o') {
char fmt[] = "skb %p len %d\n";
/* using bpf_trace_printk() for DEBUG ONLY */
bpf_trace_printk(fmt, sizeof(fmt), skb, len);
}
return 0;
}
当调用__netif_receive_skb_core的时候在入口出调用bpf_prog1函数,这里的SEC 定义如下:可以看到每个ebpf都放在特定的段中
/samples/bpf/bpf_helpers.h:8:#define SEC(NAME) __attribute__((section(NAME), used))
在看user space部分
int main(int ac, char **argv)
{
FILE *f;
char filename[256];
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
//首先通过load_bfp_file 将kernel space的部分装载到dram中。例如本例中对应的就是bpf_prog1
if (load_bpf_file(filename)) {
printf("%s", bpf_log_buf);
return 1;
}
//当年执行下面的命令时就会调用kernel space的__netif_receive_skb_core,从而触发bpf_prog1
f = popen("taskset 1 ping -c5 localhost", "r");
(void) f;
//在bpf_prog1 中我们通过bpf_trace_printk 将log打印到pipe中,通过read_trace_pipe 来读取pipe中的log,也就是bpf_prog1输出的log
read_trace_pipe();
return 0;
}
ebpf的code 都分成user space 和 kernel space的两部分,在/samples/bpf 路径下有很多例子
我以其中的一个为例
首先看kernel 部分
SEC("kprobe/__netif_receive_skb_core")
int bpf_prog1(struct pt_regs *ctx)
{
/* attaches to kprobe netif_receive_skb,
* looks for packets on loobpack device and prints them
*/
char devname[IFNAMSIZ];
struct net_device *dev;
struct sk_buff *skb;
int len;
/* non-portable! works for the given kernel only */
skb = (struct sk_buff *) PT_REGS_PARM1(ctx);
dev = _(skb->dev);
len = _(skb->len);
bpf_probe_read(devname, sizeof(devname), dev->name);
if (devname[0] == 'l' && devname[1] == 'o') {
char fmt[] = "skb %p len %d\n";
/* using bpf_trace_printk() for DEBUG ONLY */
bpf_trace_printk(fmt, sizeof(fmt), skb, len);
}
return 0;
}
当调用__netif_receive_skb_core的时候在入口出调用bpf_prog1函数,这里的SEC 定义如下:可以看到每个ebpf都放在特定的段中
/samples/bpf/bpf_helpers.h:8:#define SEC(NAME) __attribute__((section(NAME), used))
在看user space部分
int main(int ac, char **argv)
{
FILE *f;
char filename[256];
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
//首先通过load_bfp_file 将kernel space的部分装载到dram中。例如本例中对应的就是bpf_prog1
if (load_bpf_file(filename)) {
printf("%s", bpf_log_buf);
return 1;
}
//当年执行下面的命令时就会调用kernel space的__netif_receive_skb_core,从而触发bpf_prog1
f = popen("taskset 1 ping -c5 localhost", "r");
(void) f;
//在bpf_prog1 中我们通过bpf_trace_printk 将log打印到pipe中,通过read_trace_pipe 来读取pipe中的log,也就是bpf_prog1输出的log
read_trace_pipe();
return 0;
}
阅读全文
0 0
- ebpf 实例
- eBPF编程
- 通过bcc 使用ebpf
- 张亦鸣: eBPF 简史
- 了解IO Visor的技术基石BPF与eBPF (by quqi99)
- Linux内核工程导论——网络:Filter(LSF、BPF、eBPF)
- Linux内核工程导论——网络:Filter(LSF、BPF、eBPF)
- 实例
- 实例
- 实例
- 实例
- 实例
- 实例
- 实例
- 实例
- 实例
- 实例
- 实例
- redis安装php扩展
- Mysql数据库导入导出
- Vim编辑nginx配置文件时高亮显示
- 安卓WebView问题总汇(持续更新)
- PHP实现选择排序算法
- ebpf 实例
- @RequestParam,@PathParam,@PathVariable等注解区别
- POJ1446 Girls and Boys
- 欢迎使用CSDN-markdown编辑器
- 坑爹的logstash条件判断
- 中小企业迎品牌建设最佳契机 中企动力赋能数字化智能经营
- 正则表达式手机号(大陆,香港)
- Java 内部类知识点
- 什么是热修复技术