未加星标

Linux BPF introduction

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二04 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏
BPF samples Compiling # git clone https://github.com/torvalds/linux.git # cd linux # make headers_install ##This will creates a local "usr/include" directory in the git/build top level directory, that the make system automatically pickup first. # make samples/bpf/

值得注意的是,对于kprobe,需要保证源代码的内核版本(LINUX_VERSION_CODE)与当前运行的内核版本一致,内核会 检查 :

static int bpf_prog_load(union bpf_attr *attr) { ... if (type == BPF_PROG_TYPE_KPROBE && attr->kern_version != LINUX_VERSION_CODE) return -EINVAL; # ./sockex1 TCP 0 UDP 0 ICMP 0 bytes TCP 0 UDP 0 ICMP 196 bytes TCP 0 UDP 0 ICMP 392 bytes TCP 0 UDP 0 ICMP 588 bytes TCP 0 UDP 0 ICMP 784 bytes

参考 eBPF sample programs 。

BCC

BCC is a toolkit for creating efficient kernel tracing and manipulation programs based on BPF 。

Install # echo "deb [trusted=yes] https://repo.iovisor.org/apt/xenial xenial-nightly main" | sudo tee /etc/apt/sources.list.d/iovisor.list # apt-get update # apt-get install bcc-tools

会安装下面几个包:

bcc-tools libbcc python-bcc

可以通过命令 dpkg -L bcc-tools 查看 bcc-tools 的安装目录位于 /usr/share/bcc/tools 。

参考 Installing BCC

Test bitesize

bitesize show I/O distribution for requested block sizes, by process name:

# dd if=/dev/zero of=f1.data oflag=direct bs=4k count=1024 1024+0 records in 1024+0 records out 4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.11078 s, 37.9 MB/s # ./bitesize Tracing... Hit Ctrl-C to end. ^C Process Name = 'dd' Kbytes : count distribution 0 -> 1 : 0 | | 2 -> 3 : 0 | | 4 -> 7 : 1024 |****************************************| Internal eBPF programs

BPF程序分两部分,一部分是用户态程序,另外一部分是由交给内核执行的 restricted C 代码(*_kern.c)。内核部分通过llvm将C代码编译成eBPF字节码。然后通过系统调用 bpf 将eBPF字节码传给内核,内核再将字节码JIT编译成机器码并执行:

char bpf_log_buf[LOG_BUF_SIZE]; int bpf_prog_load(enum bpf_prog_type type, const struct bpf_insn *insns, int insn_cnt, const char *license) { union bpf_attr attr = { .prog_type = type, .insns = ptr_to_u64(insns), .insn_cnt = insn_cnt, .license = ptr_to_u64(license), .log_buf = ptr_to_u64(bpf_log_buf), .log_size = LOG_BUF_SIZE, .log_level = 1, }; return bpf(BPF_PROG_LOAD, &attr, sizeof(attr)); }

基本过程如图:


Linux BPF introduction
eBPF maps

eBPF maps 是内核与用户态程序传递数据的数据结构:

int bpf_create_map(enum bpf_map_type map_type, unsigned int key_size, unsigned int value_size, unsigned int max_entries) { union bpf_attr attr = { .map_type = map_type, .key_size = key_size, .value_size = value_size, .max_entries = max_entries }; return bpf(BPF_MAP_CREATE, &attr, sizeof(attr)); }

BPF Internals - I 、 BPF Internals - II 详细介绍了BPF的原理与实现。

Others Dive into BPF: a list of reading material eBPF: One Small Step

cilium:

Cilium - BPF & XDP for containers

kprobe:

Kprobe-based Event Tracing kprobe usage example: kprobe example Reference Berkeley Packet Filter A JIT for packet filters BPF tracing filters Linux Socket Filtering aka Berkeley Packet Filter (BPF)

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: Linux数据结构数据UFJIT
分页:12
转载请注明
本文标题:Linux BPF introduction
本站链接:http://www.codesec.net/view/485555.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(23)