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 结构的值,那么首先就需要知道该结构的具体类型定义。

vmlinux.h diagram

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文件相关推荐

  1. .c和.h文件的区别(转载)

    一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...

  2. .c和.h文件的区别

    一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...

  3. 2020-10-22.c和.h文件的区别

    一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...

  4. C语言中 *.c和*.h文件的区别!

    C语言中 *.c和*.h文件的区别!      这是HR面试我的一道题,没技术上含量,不过细想起来,还是C语言的最基本的知识!俗话说,目标决定动力,细节决定成败! C文件就是C语言系列的源文件,而H文 ...

  5. C语言中 .h文件和.c文件的区别 (转)

    要理解.c文件与.h文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CP ...

  6. 【C++】.h文件与.c文件的区别

    C++源文件的编译过程与.c.h文件的区别 编译器的处理过程 要理解.c文件与.h文件有什么不同之处,首先需要弄明白编译器的工作过程.一般说来编译器会做以下几个过程: 预处理阶段: 词法与语法分析阶段 ...

  7. .c文件和.h文件之间的联系

    要理解.c文件与.h文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CP ...

  8. C语言编程之.H文件与.C文件的关系

    在C语言中,通常将程序的源代码分为.h文件和.c文件两类: .h文件(也称头文件)通常包含程序所需的函数.变量.类型和宏的声明,以便在其他文件中使用. .c文件则包含这些函数.变量.类型和宏的实现或定 ...

  9. c语言H文件意思,C语言中 *.c和*.h文件的区别!

    这是HR面试我的一道题,没技术上含量,不过细想起来,还是C语言的最基本的知识!俗话说,目标决定动力,细节决定成败! C文件就是C语言系列的源文件,而H文件则是C语言的头文件,即C系列中存放函数和全局变 ...

最新文章

  1. 好文推荐,15 分钟教你搞懂 Git!
  2. 树莓派(raspberry)启用root账户
  3. 前端答题小游戏_这是什么神奇操作!两个前端一周上线一款联机小游戏
  4. Linux(CentOS)中常用软件安装,使用及异常——Zookeeper, Kafka
  5. Pyppeteer 使用笔记
  6. 数据列表的分页实现————分页敏捷开发
  7. JAVA day09 内部类(成员内部类,静态内部类,局部内部类,匿名内部类)
  8. ireport 生成一维码 和 二维码 小记
  9. 15种排序算法可视化展示
  10. HIVE 命令行操作和参数指引
  11. ironpython怎么编译_将IronPython WPF项目编译为
  12. win10的文件夹(文件资源管理器)卡住了
  13. STM32——库函数版——矩阵按键程序
  14. 智慧校园APP开发有哪些功能
  15. Japanese Student Championship 2021
  16. 树莓派安装Selenium+Chromium浏览器
  17. python Excel xlsx file; not supported
  18. signature=f89e259b8a982ede42b69434f81f5bc3,利用 cDNA-AFLP技术鉴定马铃薯晚疫病菌小种特异无毒基因候选表达序列...
  19. navicat 快捷键使用
  20. 快递100Api调用实时快递查询

热门文章

  1. 微信3.0.0 mac版
  2. USB与锂电池电源自动切换电路
  3. CC00006.NavigationLog——|FreeNAS|
  4. S355NL-Z35欧标低合金期货定轧,S355NL-Z35钢板性能介绍
  5. 2022年 考研资料更新(7月17)
  6. Java Web 网络商城案例演示五(用户激活)
  7. 基于特征向量的主成分分析(PCA)原理解释
  8. docker-compose 搭建 nats-streaming 3节点集群
  9. 年薪NNN万数据库牛人牛新庄的成长历程
  10. 转转二手突围传统交易模式,成为交易市场新星