首页 > 编程语言 >使用cilium开发ebpf程序

使用cilium开发ebpf程序

时间:2024-08-20 17:26:07浏览次数:9  
标签:map 函数 ebpf bpf 程序 go cilium

使用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是一段共享内存可以在内核和用户空间共享

在编写好c文件和main文件之后可以调用go generate go build go run -exec sudo ./hello_world来调试查看效果

标签:map,函数,ebpf,bpf,程序,go,cilium
From: https://www.cnblogs.com/Djw945/p/18369902

相关文章

  • Effective-Java-Chapter9-通用程序设计
    https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual/blob/dev/Chapter-9/Chapter-9-Introduction.md准则一将局部变量的作用域最小化不要在变量使用之前就申明,在需要使用的时候进行申明。当然这条准则不是那么绝对,大部分时候遵守就好。......
  • 基于python+flask框架的家政服务网上预约与管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在快节奏的现代生活中,家政服务成为了许多家庭不可或缺的一部分,它极大地便利了人们的日常生活,提高了生活质量。然而,传统的家政服务预约方式......
  • 基于python+flask框架的智能旅游线路规划系统设计与实现(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展和科技的日新月异,人们对旅游体验的需求日益多元化与个性化。传统的旅游线路规划往往依赖于旅行社的固定套餐或个人的......
  • 基于nodejs+vue协同过滤算法的商品推荐系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已成为人们日常生活中不可或缺的一部分。然而,面对海量的商品信息和日益增长的消费者需求,用户往往难以快速找到符合自己兴......
  • 基于nodejs+vue协同过滤算法的体育用品推荐系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的蓬勃发展和体育文化的日益普及,体育用品市场迎来了前所未有的发展机遇。然而,面对市场上琳琅满目的体育用品和消费者日益增长的个性化需求,如......
  • 基于nodejs+vue协同过滤算法的电影推荐系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网的普及和视频流媒体服务的兴起,电影作为大众娱乐的重要组成部分,其数量正以惊人的速度增长。面对浩如烟海的电影资源,用户往往难以快速找到符合自己......
  • 基于nodejs+vue协同过滤的高考志愿推荐系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着教育改革的深入和高等教育普及率的提升,高考作为人生的重要转折点,其志愿填报过程日益受到考生及家长的重视。然而,面对众多高校和复杂的专业设置,如何科学......
  • 智能小程序 Ray 开发面板 SDK —— 多语言 API 汇总
    APIAPI示例中的多语言数据源均来自于下方多语言对象exportdefault{en:{dsc_edit:'Edit',//Basicmultilanguagewithdsc_startandnameitsemanticallydsc_hour:'Hour',dsc_minute:'Minute',dsc_countdown_on:'Turnon......
  • 微信小程序如何实现组件之间的数据传递?
    在微信小程序中,组件之间的数据传递主要有以下几种方式:父组件向子组件传值:父组件可以通过设置子组件的属性(properties)来传递数据。首先,在子组件的.json文件中定义properties:{"component":true,"usingComponents":{},"properties":{"myProperty":{......
  • 围观|微信小程序开发数据绑定最佳实践?
    在微信小程序开发中进行数据绑定时,遵循一些最佳实践可以帮助你编写更高效、可维护的代码。以下是一些数据绑定的最佳实践:1.保持数据简洁尽量保持data对象中的数据简洁明了,避免嵌套过深的数据结构。这样可以减少数据更新的复杂性,提高代码的可读性。Page({data:{......