eBPF代码流程分析

0x1:应用层流程

基于Linux kernel source v5.13

1.加载bpf.o文件并处理elf section信息

1.int bpf_object__open(char *path) //参数是bpf.o文件路径
   -- __bpf_object__open(const char *path, const void *obj_buf, size_t obj_buf_sz, const struct bpf_object_open_opts *opts)//读取obj文件,解析elf中section信息。
	    -- 	obj = bpf_object__new(path, obj_buf, obj_buf_sz, obj_name);	 //创建并初始化obj结构体
    		  err = bpf_object__elf_init(obj); //读取elf文件
				  err = err ? : bpf_object__check_endianness(obj); //判断大小端
				  err = err ? : bpf_object__elf_collect(obj); //读取elf节信息(license / version / maps / .reloc / .text)
				  err = err ? : bpf_object__collect_externs(obj); //读取btf section
				  err = err ? : bpf_object__finalize_btf(obj);  //读取需要 btf处理的data section
				  err = err ? : bpf_object__init_maps(obj, opts); //读取map信息(user map / global data map / btf map / kconfig map)
				  err = err ? : bpf_object__collect_relos(obj); //读取重定位信息

2.加载obj文件到内核

2.int bpf_object__load(struct bpf_object *obj) //加载第一步生成的obj结构体
  -- bpf_object__load_xattr(struct bpf_object_load_attr *attr) 
      -- 	err = bpf_object__probe_loading(obj);  //加载bpf prog到内核(这里加载的是未经过修改的bpf代码)
          err = err ? : bpf_object__load_vmlinux_btf(obj, false); //读取内核vmlinux信息
          err = err ? : bpf_object__resolve_externs(obj, obj->kconfig); //读取内核kconfig /vmlinux / kallsysm信息
          err = err ? : bpf_object__sanitize_and_load_btf(obj); // BPF_BTF_LOAD 加载btf信息
          err = err ? : bpf_object__sanitize_maps(obj); // 判断内核支持的map种类
          err = err ? : bpf_object__init_kern_struct_ops_maps(obj);
          err = err ? : bpf_object__create_maps(obj); //BPF_MAP_CREATE 创建map
          err = err ? : bpf_object__relocate(obj, attr->target_btf_path); //处理bpf代码重定位信息
          err = err ? : bpf_object__load_progs(obj, attr->log_level); //这里加载经过重定位 btf修改的bpf代码 ****
             -- libbpf__bpf_prog_load
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值