聊聊对 BPF 程序至关重要的 vmlinux.h文件
1.1 前言
eBPF 是一项令人兴奋的强大技术,其允许开发者在 Linux 内核的核心处添加自定义代码功能,并且我们还可以通过编写简单的 C 或 Go 程序与加载到内核中的 eBPF 程序交互,用于加载或读取数据。运行在内核中的 BPF 程序可以检查所附加进程(或内核模块)的内存数据。为此,eBPF 程序需要确切了解处理涉及的数据结构类型,这可以通过 #include "vmlinux.h"
实现。在本中,我将详细介绍 vmlinux.h
是什么以及为什么你在编写 eBPF 程序开始就应该使用它。
1.2 vmlinux.h
概述
确切说,vmlinux.h
是使用工具生成的代码文件。它包含了系统运行 Linux 内核源代码中使用的所有类型定义。当我们编译 Linux 内核时,会输出一个称作 vmlinux
的文件组件,其是一个 ELF[1] 的二进制文件,包含了编译好的可启动内核。vmlinux
文件通常也会被打包在主要的 Linux 发行版中。
内核中的 bpftool 工具其中功能之一就是读取 vmlinux
文件并生成对应的 vmlinux.h
头文件。vmlinux.h
会包含运行内核中所使用的每一个类型定义,因此该文件的比较大。
生成 vmlinux.h
文件的命令如下:
$ bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
包含该 vmlinux.h
,就意味着我们的程序可以使用内核中使用的所有数据类型定义,因此 BPF 程序在读取相关的内存时,就可以映射成对应的类型结构按照字段进行读取。
例如,Linux 中的 task_struct[2] 结构用于表示进程,如果 BPF 程序需要检查 task_struct
结构的值,那么首先就需要知道该结构的具体类型定义。
1.3 CORE 一处编译,到处运行
由于 vmlinux.h
文件是由当前运行内核生成的,如果你试图将编译好的 eBPF 程序在另一台运行不同内核版本的机器上运行,可能会面临崩溃的窘境。这主要是因为在不同的版本中,对应数据类型的定义可能会在 Linux 源代码中发生变化。
但是,通过使用 libbpf 库提供的功能可以实现 "CO:RE"(一次编译,到处运行)。libbpf 库定义了部分宏(比如 BPF_CORE_READ),其可分析 eBPF 程序试图访问 vmlinux.h
中定义的类型中的哪些字段。如果访问的字段在当前内核定义的结构中发生了移动,宏 / 辅助函数会协助自动找到对应字段【译者注:对于可能消失的字段,也提供了对应的辅助函数 bpf_core_field_exists】。因此,我们可以使用当前内核中生成的 vmlinux.h
头文件来编译 eBPF 程序,然后在不同的内核上运行它【译者注:需要运行的内核也支持 BTF 内核编译选项】。
1.4 总结
通过生成包含所有 Linux 内核类型的 vmlinux. h
头文件,我们可以在编写 eBPF 程序时对内核类型相关的头文件依赖。在下一篇文章中,我将使用 vmlinux.h
的便利性、libpf 的灵活性和 Go 的安全性来编写 eBPF 程序,-- 敬请期待!【译者注:下一篇参见这里[3]】
该文章首次出现在 Grant Seltzer 的博客[4]上。
原文地址:https://blog.aquasec.com/vmlinux.h-ebpf-programs
作者:Grant Seltzer
时间:2021 年 4 月 30 号
参考资料
[1]
ELF: https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
[2]
task_struct: https://elixir.bootlin.com/linux/latest/source/include/linux/sched.h#L649
[3]
这里: https://www.grant.pizza/blog/libbpf-beginners-part-one/
[4]
博客: https://www.grant.pizza/blog/vmlinux-header/
聊聊对 BPF 程序至关重要的 vmlinux.h文件相关推荐
- .c和.h文件的区别(转载)
一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...
- .c和.h文件的区别
一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...
- 2020-10-22.c和.h文件的区别
一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...
- C语言中 *.c和*.h文件的区别!
C语言中 *.c和*.h文件的区别! 这是HR面试我的一道题,没技术上含量,不过细想起来,还是C语言的最基本的知识!俗话说,目标决定动力,细节决定成败! C文件就是C语言系列的源文件,而H文 ...
- C语言中 .h文件和.c文件的区别 (转)
要理解.c文件与.h文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CP ...
- 【C++】.h文件与.c文件的区别
C++源文件的编译过程与.c.h文件的区别 编译器的处理过程 要理解.c文件与.h文件有什么不同之处,首先需要弄明白编译器的工作过程.一般说来编译器会做以下几个过程: 预处理阶段: 词法与语法分析阶段 ...
- .c文件和.h文件之间的联系
要理解.c文件与.h文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CP ...
- C语言编程之.H文件与.C文件的关系
在C语言中,通常将程序的源代码分为.h文件和.c文件两类: .h文件(也称头文件)通常包含程序所需的函数.变量.类型和宏的声明,以便在其他文件中使用. .c文件则包含这些函数.变量.类型和宏的实现或定 ...
- c语言H文件意思,C语言中 *.c和*.h文件的区别!
这是HR面试我的一道题,没技术上含量,不过细想起来,还是C语言的最基本的知识!俗话说,目标决定动力,细节决定成败! C文件就是C语言系列的源文件,而H文件则是C语言的头文件,即C系列中存放函数和全局变 ...
最新文章
- 好文推荐,15 分钟教你搞懂 Git!
- 树莓派(raspberry)启用root账户
- 前端答题小游戏_这是什么神奇操作!两个前端一周上线一款联机小游戏
- Linux(CentOS)中常用软件安装,使用及异常——Zookeeper, Kafka
- Pyppeteer 使用笔记
- 数据列表的分页实现————分页敏捷开发
- JAVA day09 内部类(成员内部类,静态内部类,局部内部类,匿名内部类)
- ireport 生成一维码 和 二维码 小记
- 15种排序算法可视化展示
- HIVE 命令行操作和参数指引
- ironpython怎么编译_将IronPython WPF项目编译为
- win10的文件夹(文件资源管理器)卡住了
- STM32——库函数版——矩阵按键程序
- 智慧校园APP开发有哪些功能
- Japanese Student Championship 2021
- 树莓派安装Selenium+Chromium浏览器
- python Excel xlsx file; not supported
- signature=f89e259b8a982ede42b69434f81f5bc3,利用 cDNA-AFLP技术鉴定马铃薯晚疫病菌小种特异无毒基因候选表达序列...
- navicat 快捷键使用
- 快递100Api调用实时快递查询