type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
0 运行环境配置
运行环境相关的配置、大家可以参考我这一篇文章
1 Hello world 程序分析
1.1 文件结构
整个 Hello world 例程包含以下三个文件,其中 bpf_program.c 是与 bpf 程序相关的文件,loader.c 用来加载上面编写的 bpf 程序, Makefile 用来快速构建。下面我们就把各个文件中的内容展示出来、对各个文件都进行分析了解一下。
1.2 bpf_program.c
这是一个很简单的 BPF hello world 程序,但是却包含着 BPF 运行所需的必要条件。
SEC 属性
- 我们使用
SEC
属性告知 BPF 虚拟 机何时运行此程序。在本例中,当检测到execve
系统调用跟踪点被执行时, BPF 程序将运行 。
- 跟踪点
- 跟踪点是内核二进制代码中的静态标记,允许开发人员 注入代码来检查内核的执行。这里,只需知道
execve
是执行其他程序的指令。当内核检测到execve
执行时, BPF 程序被执行,我们会看到消息输出Hello,BPF World !
。
- 程序许可证
- 在示例的最后,指定了程序许可证。因为 Linux 内核采用
GPL
许可证,所以它只能加载GPL
许可证的程序。如果将程序设置为其他许可证,内核将拒绝加载该程序。
1.3 loader.c
这个文件是用来将编译完成的 BPF 程序加载至内核中运行的,使用内核提供的
load_bpf_file
辅助函数,它将获取一个二进制文件将它加载到内核中,对编译和加载的程序按模板抽象进行处理。1.4 Makefile
程序编译脚本,解放双手。
如果上面的 Makefile 看不明白的话、可以看看下面的这个 Makefile 文档。
2 运行测试
好的、上面我们已经把 Hello world 例程里面涉及到的所有代码已经分析完毕,接下来我们就应该开始实际的测试,看一下这个代码最终运行起来的效果如何。
2.1 编译代码
- 清理工作空间
- 运行编译命令
可以看到编译完成的时候、生成了 bpf_program.o 与 monitor-exec 这两个文件、其中 .o 文件就是编译后的 BPF 二进制文件,而 monitor-exec 则是 BPF 代码加载程序。
2.2 运行测试
执行
sudo ./monitor-exec
命令将 BPF 程序加载至内核中去,这个时候再开启一个终端执行其它命令、查看程序的工作状态。如果你不使用 sudo 运行该程序,将会返回错误信息,因为对于大多数 BPF 程序而言,只能由 root 特权用户加载到内核中。
可以看到每次我们运行一个命令、程序都会给我们打印一条语句与期望中的程序运行状态一致。
程序停止后,消息将不在终端上显示。 一 旦程序终止,加载的 BPF 程序将从 BPF 虚拟机中卸载。
3 源代码
- Author:tangcuyu
- URL:https://expoli.tech/articles/2022/12/12/The-BPF-Learning-series/hello-bpf-world
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts