使用cilium开发ebpf程序

news/2024/9/21 14:34:34/文章来源:https://www.cnblogs.com/Djw945/p/18369902

使用go开发ebpf程序最常见的一个框架就是cilium。开发前需要了解ebpf,了解go语言的基础知识。

在本地安装go之后下载bpf2go

go get github.com/cilium/ebpf/cmd/bpf2go

从最简单的开发框架开始

下载示例源码

git clone https://github.com/cilium/ebpf.git

在ebpf/examples下是官方给出的开发样例,以kprobe为例:
代码结构如下

这里以.o结尾的文件都是预编译,使用命令行

go run -exec sudo ./kprobe
就可以直接运行,打印调用次数

如果使用
go clean go generate go build
就可以清除预编译然后重新执行编译
这里我们通过写一个简单的ebpf代码来看一下如何开发

首先bpf_bpfeb.go和bpf_bpfel.go文件不需要更改,属于模板文件。我们要修改的是c文件和main.go文件

首先在c文件中我们一般不需要引入头文件,项目的examples/headers里面已经预准备了头文件,在main.go的//go:generate部分会链接进来

这里的大概逻辑是使用map去存储每次我们调用bpf函数获取到的结果,在main.go中去访问这个map并打印结果或者写到日志

struct bpf_map_def SEC("maps") counting_map = { .type = BPF_MAP_TYPE_ARRAY, .key_size = sizeof(u32), .value_size = sizeof(u64), .max_entries = 1, };

这个结构体记录了key和value的对应值 首先采集到的数据通过更新或者插入写到map中然后使用sync函数同步

在main函数中有几个固定的步骤

  1. 定义要trace的内核函数名称
  2. 允许当前进程锁定内存
  3. 初始化bpfObjects并link到我们自定义的函数,link可以调用kprobe也可以调用Tracepoint,需要看个人需求。这里需要填写刚才定义的objs的自定义函数。这里需要注意,比如我在c文件中定义的函数名为handle_tp,在这里如果直接这样写会报错objs找不到这个成员函数。这里需要将函数转为驼峰写法(应该是go做过转换)。写成HandleTp就可以正常编译。
  4. 启动一个定时器,每秒去读一次map,并打印值

这里bpf_map_def结构体非常重要,他的key其实是固定的为0,当然我们可以自定义一个key值。这里map是一段共享内存可以在内核和用户空间共享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/784407.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element ui 中日期选择器disabledDate的几种用法

现实开发中,遇到截止日期,跟着接口返回来确定的。需要用函数来实现disabledDate 这块知识,在手册文档写的也不详细。 这块实现基于element-ui 2.15.14https://blog.csdn.net/hellowang02/article/details/131575982相信坚持的力量,日复一日的习惯.

Paper Reading: SAFE: Scalable Automatic Feature Engineering Framework for Industrial Tasks

本文提出了一种可扩展自动特征工程方法 SAFE,它包括特征生成阶段和特征选择阶段,具备较高的计算效率、可扩展性,能满足实际业务问题的要求。不同于使用算子枚举所有的生成特征,本文的特征生成阶段专注于挖掘原始特征对,以更高的概率生成更有效的新特征。在特征选择阶段,本…

织梦模板引擎的代码样式有如下几种形式

1、织梦模板引擎的代码样式有如下几种形式:{dede:标记名称 属性=值/} {dede:标记名称 属性=值}{/dede:标记名称}{dede:标记名称 属性=值}自定义样式模板(InnerText){/dede:标记名称} 提示: 如果使用带底层模板的标记,必须严格用{dede:标记名称 属性=值}{/dede:标记名称} 这种…

Flannel VxLAN DR 模式

Flannel VxLAN DR 模式Flannel VxLAN DR 模式 一、环境信息主机 IPubuntu 172.16.94.141软件 版本docker 26.1.4helm v3.15.0-rc.2kind 0.18.0clab 0.54.2kubernetes 1.23.4ubuntu os Ubuntu 20.04.6 LTSkernel 5.11.5 内核升级文档二、安装服务 kind 配置文件信息 $ cat insta…

从零开始学习C++(0)

这是什么? 要先学习 C++,我们要先了解 C++ 是什么这是 Wiki Pedia 的解释,我们来提炼一下:C++ 是一种高级语言。 C++ 是 C 语言的扩展升级版。 C++ 是面向对象语言。下载环境 简单了解一下后,我们来下载 C++ 编译器环境。 目前有很多种编译器,例如:Dev-C++ CodeBlocks V…

vm linux 共享文件夹

虚拟机设置共享目录挂载mkdir /mnt/hgfs mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other cd /mnt/hgfs/ ls 留待后查,同时方便他人 联系我:renhanlinbsl@163.com

win10mysql服务丢失

虚拟机中安装的mysql突然连接不上了,点击计算机-管理,发现mysql服务都不见了。 使用命令行重新安装:mysqld.exe --install 又提示:Install/Remove of the Service Denied!,这个是权限问题,用管理员运行就好 到计算机-管理中找到msyql服务,点击启动,正常了纯属记录程序…

vue3.0启动报错

vue突然重启报错:Two output files share the same path but have different contents,按照网络方法各种依赖重新清除,再安装,不太行,仔细一看,透,vue大小写写错了

SpringBoot 快速入门

SpringBoot 快速入门创建空工程在空工程下创建一个 maven工程将该maven工程变成springboot 工程,只需要在pom文件中指定parent为 springboot的基础包 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/P…

达梦数据库获取SQL真实的执行计划

一、set autotrace trace disql下执行set autotrace trace开启AUTOTRACE功能,执行SQL语句,并打印实际的执行计划。 SQL> set autotrace traceSQL> select a.employee_name, b.department_name from dmtest.t_emp a join dmtest.t_dept b on a.department_id = b.depart…

windows大全

1、快捷键 2、win+r msinfo32 系统信息 services.msc 服务 regedit 注册表编辑器 mstsc 远程桌面连接 gpedit.msc 本地组策略编辑器 msconfig 系统配置

MySQL主从同步如何保证数据一致性?

MySQL 主从同步是 MySQL 集群方案中的一种,也是实现难度最低的一种。 然而,现在的面试都不问 MySQL 主从同步原理了,而是开始问主从同步怎么保证数据一致性问题了。 所以,今天就给大家安排上了。 1.什么是数据一致性? 数据一致性是指在一个系统中,数据在不同的部分、不同…