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