eBPF Hello World:如何通过eBPF截获系统调用

云原生领域eBPF已经被广泛应用,很多开源的项目都是基于eBPF,譬如网络插件Cilium。Tcpdump底层的包过滤也是基于eBPF的。其实eBPF的功能远不止如此,如下图所示,eBPF贯穿了整个操作系统,不仅支持各种系统调用、文件系统、网络协议栈和内存管理,甚至可以到驱动层面。

eBPF Hello World:如何通过eBPF截获系统调用

期的BPF程序的编写,一般都是直接使用BPF指令集来编写程序,因此难度是极高的。于是就出现了使用C语言编写的BPF程序。C语言需要通过clang/llvm将程序编译为BPF字节码,然后再注入到内核中。但是对于注入的方式,还是需要通过自己手动的方式才能够注入。近几年比较流行的是通过BCC(BPF Compiler Collection)。BCC 是一个在Github开源的用于编写和运行BPF程序的工具库集合,支持Python和C++编写用户空间程序。

任何一个复杂的东西都有一个简单的hello world开始,今天我们通过BCC+ eBPF截获一个系统调用:sys_clone,这个系统调用是创建进程的时候被调用。

eBPF Hello World:如何通过eBPF截获系统调用

下面是通过一个Python脚本编写的一个helloWorld程序,通过kprobe截获sys_clone调用。本机环境是Centos 8.3 并且已经通过 ”yum install bcc-tools“ 安装了bcc工具包。代码如下:

#!/usr/bin/python3

from bcc import BPF

prog = """
	int kprobe__sys_clone(void *ctx) {
		bpf_trace_printk("Hello, World!n");
		return 0;
	}
"""

b = BPF(text=prog)
b.trace_print()

其中,kprobe__sys_clone,使用kprobe的方式追踪内核系统调用sys_clone()。 kprobe 是内核动态追踪的一种实现方法。kprobe__xxx 的C函数定义表示使用kprobe方式追踪内核系统调用xxx()函数。

执行这个脚本后,打开另一个shell窗口,随便执行一个命令,譬如: ls ,在这个窗口便会输出如下信息。

b'            bash-2044  [001] ....   353.648215: 0: Hello, World!'

可以看到我们的hello world程序已经成功执行,只要系统中sys_clone被执行,就会有输出。

展开阅读全文

页面更新:2024-04-14

标签:系统   工具包   文件系统   字节   内核   底层   脚本   层面   函数   插件   窗口   语言   方式   程序   科技   网络

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top