LWN:利用BPF来检查kernel数据结构内容!

Linux中的Netlink详解 下面是一个更详细的内核Netlink代码示例,包括内核模块的初始化和退出函数,Netlink套接字的创建和消息处理函数。该示例代码实现了一个简单的内核模块,通过Netlink与用户空间进行通信,将接收到的消息打印到内核日志中。在这个示例代码中,我们首先创建了一个Netlink套接字,并将其绑定到指定的地址上。然后,我们构造了一个Netlink消息,将用户空间的消息内容复制到消息缓冲区中,并通过。对于Netlink来说,地址由。以下是一个详细的用户空间代码示例,用于与上述内核模块中的Netlink进行通信。 阅读详情

关注了就能看到更多这么棒的文章哦~

Dumping kernel data structures with BPF

By Jonathan Corbet
April 27, 2020

原文来自:https://lwn.net/Articles/818714/

主译:DeepL

自从操作系统内核软件出现以来,就一直有需求要从内核中的数据结构中提取信息。多年来,人们采取了各种各样的方法来实现。如今,人们很自然地将BPF作为解决各种问题的首选工具,从内核数据结构中获取信息也不例外。目前有两个正在review的patch set,它们在使用BPF从内核数据结构提取信息到用户空间方面,采取了两种不同的方法。

当编者第一次遇到古老的Unix系统时,当时,类似ps这样的工具会通过打开/dev/kmem直接在内核的内存空间中来获取信息。这种方法的优点是不需要内核提供API来做支持,但也有一些缺点,包括:安全问题、在收集复杂数据时没有原子操作保护、偶尔会返回随机的错误数据。早期,这种行为还算可以接受,但当代用户对这种行为的容忍度却变得出奇的低。在内核内存中到处乱翻数据的行为现在已经非常不受欢迎了。

在现在的Linux系统中,这个问题可以通过系统调用或者/proc、sysfs、debugfs虚拟文件组合在一起来解决。这种方法是可行的,但也有一些问题。每当要输出的信息本身发生变化时,内核必须进行修改;debugfs中的 "调试 "信息最终会变成正常运行的系统操作的依赖项(其实debugfs根本不应该被打开),而且在修改之后很可能会导致现有应用程序无法正常运行。因此,人们自然期待着更灵活、适应性更强的方案。

Structure dumpers

有一种方法是由Yonghong Song发布的,它直接针对虚拟文件方案。简而言之,它允许提供BPF程序来实现类似/proc这样的文件,从而提供各种数据结构的内容给用户空间。

具体地说,它创建了一个新的虚拟文件系统,希望mount到/sys/kernel/bpfdump。这是一个singleton文件系统,也就是说无论mount多少次(或mount到多少个不同的命名空间里去),它提供的内容都是相同的。然后,内核子系统可以在该文件系统中创建子目录来提供特定的数据结构。例如,在这组patch中,创建了task子目录,用来把内核中当前在用的task_struct结构暴露出来,还有bpf_map用来遍历BPF maps列表,netlink则提供了当前活跃的netlink连接的信息。

然后这个补丁系列增加了一个新的BPF program类型,叫做BPF_TRACE_DUMP。这种program被调用时会被提供一个指向结构的指针,主要依赖这个函数来生成后续要提供给user space的数据,最终通过seq_file结构来提供给user space。为此,新增加了两个helper function,即bpf_seq_printf()和bpf_seq_write()。这些program会以常规方式通过bpf()系统调用加载到内核中。

最后,扩展了BPF_OBJ_PIN命令的含义,该命令最初是为了支持BPF program和maps能在指向它们的文件描述符被关闭后仍然可用。利用这个命令,可以把BPF_TRACE_DUMP program给固定(pin)到/sys/kernel/bpfdump目录下创建的一个文件中。因此,例如,如果某人人想创建一个新的进程查看程序,名为 "myps",那他可以加载一个BPF program,从task structure中生成所需的输出信息,然后将其 "pin"到/sys/kernel/bpfdump/task下的一个名为myps的文件中。

这个patch set包含了一些示例程序来作为演示以及自测试。比如,可以在/sys/kernel/bpfdump/netlink下固定(pin)一个与/proc/net/netlink产生的输出完全相同的文件。当然,重复提供现有接口已经提供的功能,并没有多少好处,但这确实展示了如何创建新接口。有了这个功能之后,用户可以相对高效地创建接口来提供他们所需要的信息。如果需要新的信息,也不需要改变内核。

不过,还是需要先进行一些配置的。每一个以这种方式提供的structure类型都需要一些支持代码来遍历这些active structure,并将其传递给相关的BPF program。但这对每种structure来说都是一次性的工作。在这之后,理论上,内核开发者再也不用费心考虑如何从该结构类型导出信息到用户空间了。只要没有人担心这些提供出去的数据需要保密就行。

printk()

另一种方法是由Alan Maguire发布的,它着重满足debug场景的需求。当这种特定场景下,人们很自然地就想用printk()来提供信息到user space。

在调试某个问题时,通常需要查看内核数据结构中的各个字段。在正确的地方加上printk()调用,然后重新编译内核,通常就可以达到目的。可是,很常见的一种情况是打印的字段不够,就需要重新开始。人们就挺想要一个调试功能:能够简单地打印任意一个结构的全部内容。这在Python这样的解释语言中很容易做到,但在C语言中一般没有。

打印某些特定structure类型,在内核中已经支持一段时间了。例如,rtc_time结构就可以使用%ptR格式描述符来直接打印。但是只有很少的结构可以支持,每一个新增结构都会导致在printk()中添加更多的代码,而且每当structure被修改时,printk中的相关打印代码也必须更新。所以这个功能距离能打印任意structure,还差得很远。

Maguire意识到,在内核中加入了BPF type format(BTF)数据之后,就可以有更好的方案了。BTF最初是为了解决BPF program在系统间二进制兼容的问题而加入的。任何特定的数据结构的内部排布都会随着内核配置的改变而变化,这使得人们创建好的BPF program换一个kernel config之后就很可能无法运行了。BTF用来在内核编译之后描述内核中最终使用的数据结构。用户空间的工具可以在将BPF program加载到内核中之前,利用这些structure中的offset信息来把structure的引用能 "重新定位 "到正确位置。

一旦我们在内核中获得了structure layout的描述信息,就可以用它来打印出该structure的数据。所以Maguire添加了一个新的format directive格式描述来实现这个功能。这个格式是"%pT<type>",其中type是传递的结构指针的类型。而"%pTN<type>"则会再加上字段名(field name)。patch set中提供的一个例子打印了sk_buff结构(在网络层中用于保存数据包),只用了下面这样一行语句:

    pr_info("%pTN<struct sk_buff>", skb);

就打印出了这么完整的信息:

    {{{.next=00000000c7916e9c,.prev=00000000c7916e9c,
      {.dev=00000000c7916e9c|.dev_scratch=0}}|
      .rbnode={.__rb_parent_color=0,.rb_right=00000000c7916e9c,.rb_left=00000000c7916e9c}|
      .list={.next=00000000c7916e9c,.prev=00000000c7916e9c}},
      {.sk=00000000c7916e9c|.ip_defrag_offset=0},{.tstamp=0|.skb_mstamp_ns=0},
      .cb=['\0'],{{._skb_refdst=0,.destructor=00000000c7916e9c}|
      .tcp_tsorted_anchor={.next=00000000c7916e9c,.prev=00000000c7916e9c}},
      ._nfct=0,.len=0,.data_len=0,.mac_len=0,.hdr_len=0,.queue_mapping=0,
      .__cloned_offset=[],.cloned=0x0,.nohdr=0x0,.fclone=0x0,.peeked=0x0,
      .head_frag=0x0,.pfmemalloc=0x0,.active_extensions=0,.headers_start=[],
      .__pkt_type_offset=[],.pkt_type=0x0,.ignore_df=0x0,.nf_trace=0x0,
      .ip_summed=0x0,.ooo_okay=0x0,.l4_hash=0x0,.sw_hash=0x0,.wifi_acked_valid=0x0,
      .wifi_acked=0x0,.no_fcs=0x0,.encapsulation=0x0,.encap_hdr_csum=0x0,
      .csum_valid=0x0,.__pkt_vlan_present_offset=[],.vlan_present=0x0,
      .csum_complete_sw=0x0,.csum_level=0x0,.csum_not_inet=0x0,.dst_pending_co

这里出于可读性考虑,原来的 "全在一行"的输出方式被做了一些分割。输出信息被限制为1024个字符,这就解释了上面的结尾为什么看起来比较突兀。如果这个限制给用户造成了麻烦的话,可以省略掉"N",这样就能输出更多的字段,但没有字段名了。Arnaldo Carvalho de Melo 建议增加一个额外的 "z"选项,值为零的字段就不用打印了,这样输出更加紧凑。这个建议可能会在下一个版本的patch set中实现。

虽然printk()是这个功能的主要使用者,但Maguire认为它也可以用在其他地方。例如,ftrace 可以用它来打印出 tracepoints 的结构内容,或者kernel可以用它来增强 oops之后的输出内容。

这些patch set展示了两种不同的方法,利用内核的 BPF 功能来格式化内核数据结构中的信息,以便在内核之外使用。它们解决的是不同的使用场景,所以并不是说这两种方法只能选一种合入mainline。两者都以其各自的方式使内核内部更容易查看,期待它们的合入。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~

CRIB: checkpoint/restore in BPF Linux进程检查点/恢复技术发展历程与CRIB新方案探索 摘要:Linux进程检查点/恢复技术自1998年首次提出以来经历了多次演进。早期内核补丁方案因复杂性和可靠性问题未能成功,2011年转向用户空间的CRIU成为主流解决方案,但依赖非专用内核接口导致效率低下和兼容性问题。最新提出的CRIB方案创新性地利用BPF技术,通过内核态直接读取进程状态,显著提升性能。然而,恢复功能因BPF写入限制面临挑战,社区对BPF_CORE_WRITE的安全隐患存在分歧。CRIB目前聚焦检查点功能,其未来发展取决于内核接口 阅读详情

相关推荐

时序约束实战:从setup/hold到时钟路径约束的深度解析

本文深度解析数字设计中的时序约束实战,重点探讨如何从setup/hold检查的核心原理出发,理解并应用时钟路径约束。文章通过剖析Path Requirement的计算逻辑,结合同频、倍频及异步时钟域等典型场景,提供了从解读时序报告到编写、调试SDC约束的系统方法,帮助工程师有效应对复杂SoC设计中的时序收敛挑战。

weixin_29291185的博客 105

netlink机制

netlink是一种基于网络的机制,允许在内核内部以及内核与用户层之间进行通信。最早在内核2.2引入,旨在替代笨拙的IOCTL,IOCTL不能从内核向用户空间发送异步消息,而且必须定义IOCTL号。 Netlink协议定义在RFC3549中。以前是可以编译成模块,现在直接集成到内核了。与profs和sysfs相比,有一些优势如下: 不需要轮询;系统调...

weixin_34363171的博客 463

FPGA图像处理入门 ZYNQ7020 图像中值膨胀腐蚀滤波

图像处理的三种滤波 中值滤波应用较为广泛 综合膨胀和腐蚀可以实现边缘检测。

Coast_的博客 715

Linux 网络之netlink 简介

Linux 网络之netlink 简介以及一个简单使用demo

小立仔 1万+

PaddleOCR PP-OCRv5实战:5分钟搞定身份证信息提取(附完整代码)

本文详细介绍了如何利用PaddleOCR的PP-OCRv5模型,在5分钟内快速搭建身份证信息提取流程。文章从环境搭建、核心代码实战出发,深入解析了PP-OCRv5针对证件识别的优化特性,并提供了从OCR结果到结构化数据的完整处理方案与避坑指南,帮助开发者高效实现AI驱动的自动化信息提取。

salt9的博客 782

GNSS-RTK/INS紧组合里,那个‘杆臂改正’到底怎么算?一个公式讲清INS与天线位置的关系

本文深入解析GNSS-RTK/INS紧组合导航系统中的杆臂改正(Lever Arm Correction)原理与实现方法。详细介绍了杆臂效应的物理本质、数学建模及误差扰动分析,揭示了IMU与GNSS天线位置关系的核心公式,并提供了工程实现中的常见误区与验证方法。通过Python代码示例和紧组合量测模型处理流程,帮助开发者准确理解并应用这一关键技术。

weixin_33137081的博客 356

内核与用户态进程间通讯之Netlink

Netlink是linux提供的用于内核和用户态进程之间的通信方式。但是注意虽然Netlink主要用于用户空间和内核空间的通信,但是也能用于用户空间的两个进程通信。只是进程间通信有其他很多方式,一般不用Netlink。除非需要用到Netlink的广播特性时。 一般来说用户空间和内核空间的通信方式有三种:/proc、ioctl、Netlink。而前两种都是单向的,但是Netlink可以实现双工通信。...

u010304442的博客 2803

Spring Cloud Gateway 结合OAuth2提供UAA服务

微服务做用户认证和授权一直都是一个难点,随着OAuth2.0的密码模式被作废,更是难上加难了。今天胖哥群里的一个群友搭建用户认证授权体系的时候遇到了一些棘手的问题,这让胖哥觉得是时候分享一些思路出来了。 两种思路 通常微服务的认证和授权思路有两种: 所有的认证授权都由一个独立的用户认证授权服务器负责,它只负责发放Token,然后网关只负责转发请求到各个微服务模块,由微服务各个模块自行对Token进行校验处理。 另一种是网关不但承担了流量转发作用,还承担认证授权流程,当前请求的认证信息由网关中继给下游

duan18888的博客 648

LWN:用BPF来修改kernel里的operation structure!

关注了就能看到更多这么棒的文章哦~Kernel operations structures in BPFByJonathan CorbetFebruary 7, 2020原文来自:ht...

Linux News搬运工 577

STM32F407 HAL库定时器触发ADC采集与DMA数据传输(定时器TIM+ADC+DMA)

在STM32F407系列微控制器的开发中,结合定时器、ADC(模数转换器)与DMA(直接存储器访问)控制器,能够显著提升数据采集与传输的效率。本文将指导你如何使用STM32 HAL库,通过定时器触发ADC1的单通道采集,利用DMA传输数据,最终通过串口将电压值打印出来。具体实现中,我们将读取ADC1的通道5(对应引脚PA5),并将转换得到的电压值发送到串口助手上进行显示。

jmlinux的博客 7011

SGM5860x高精度ADC驱动开发与SPI接口实战指南

本文详细介绍了SGM5860x高精度ADC芯片的驱动开发与SPI接口配置实战。内容涵盖芯片特性、SPI通信设置、寄存器映射、驱动初始化、数据采集处理、校准优化及调试技巧,帮助开发者快速掌握国产24位ADC的应用,提升工业测量项目的精度与稳定性。

vvv99的博客 717

LWN: 允许非root用户访问bpf

点击上方蓝色字关注我们~Providing wider access to bpf()ByJonathan CorbetJune 27, 2019bpf()系统调用,可...

Linux News搬运工 1059

Unity游戏开发实战:如何用科大讯飞离线语音合成SDK实现NPC对话(附完整代码)

本文详细介绍了如何在Unity游戏开发中使用科大讯飞离线语音合成SDK实现NPC对话系统。通过完整的代码示例和优化技巧,开发者可以快速集成本地语音合成功能,提升游戏沉浸感,同时避免网络延迟问题。文章涵盖SDK集成、核心语音合成模块实现以及高级应用技巧,特别适合RPG游戏开发者参考。

weixin_29268385的博客 181

LWN:KRSI与propprietary BPF program!

关注了就能看到更多这么棒的文章哦~KRSI and proprietary BPF programsByJonathan CorbetJanuary 17, 2020原文来自:htt...

Linux News搬运工 854

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LWN:使用BPF来选择OOM kill的对象!

关注了就能看到更多这么棒的文章哦~Out-of-memory victim selection with BPFBy Jonathan CorbetAugust 17, 2023ChatGPT assisted translationhttps://lwn.net/Articles/941614/默认配置下的 Linux 内核允许进程分配的内存比系统实际可提供的内存更多。这个策略可以更好地利用物理...

Linux News搬运工 1047

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LWN:细粒度的BPF令牌!

关注了就能看到更多这么棒的文章哦~Finer-grained BPF tokensBy Jonathan CorbetOctober 12, 2023ChatGPT translationhttps://lwn.net/Articles/947173/在 BPF 虚拟机中运行的程序可以根据其挂载(attach)方式执行许多特权操作;因此,加载和运行这些程序的相关 capability 本身必须是需...

Linux News搬运工 1137

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LWN: Facebook使用BPF的情况以及其他

点击上方蓝色“Linux News搬运工”关注我们~BPF at Facebook (and beyond)ByJonathan CorbetKernel Recipe...

Linux News搬运工 695

LWN:使用GCC编译生成BPF程序

点击上方蓝色“Linux News搬运工”关注我们~ Compiling to BPF with GCC ByJonathan Corbet LPC 自从在kern...

Linux News搬运工 1557

LWN:自动对kernel进行调优!

关注了就能看到更多这么棒的文章哦~Auto-tuning the kernelBy Daroc AldenDecember 11, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/998576/Linux 内核(Linux kernel)拥有许多可调参数(tunable parameters)。尽管网络上充斥着大量关于如何设置这些参...

Linux News搬运工 1470

LWN: BPF和realtime patch的冲突

BPF and the realtime patch setByJake Edge7月份的时候,Linus Torvalds在5.3 merge window时期合入p...

Linux News搬运工 528

LWN:2022 Linux存储、文件系统、内存管理以及BPF峰会!

关注了就能看到更多这么棒的文章哦~The 2022 Linux Storage, Filesystem, Memory-Management, and BPF SummitBy Jonathan CorbetMay 4, 2022DeepL assisted translationhttps://lwn.net/Articles/893733/Linux Storage,...

Linux News搬运工 737

LWN:简单又高效!利用bpftrace分析kernel行为

点击上方蓝色字关注我们~Kernel analysis with bpftraceJuly 18, 2019本文由Brendan Gregg 提供在2019 Linux...

Linux News搬运工 2477

Why don't we rename Linux to BPF-kernel?

题目来自lwn的一个带有嘲讽的针对性评论。该文链接如下: https://lwn.net/Articles/808503/ 针对该评论的回应如下: A heavy reliance on BPF is not a bad thing in and out of itself. It makes me remember the GCC scenario: it made pluggability...

TCP/IP 3146

LWN:kernel通用的ring buffer!

关注了就能看到更多这么棒的文章哦~A generic ring buffer for the kernelBy Jonathan CorbetJune 6, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/976836/内核的用户空间 ABI 中不乏环形缓冲区(ring buffer);在例如BPF、io_uring、perf和...

Linux News搬运工 1523

LWN:统一kernel tracing处理!

Unifying kernel tracingByJake EdgeOctober 30, 2019OSS EU本文译自:https://lwn.net/Article...

Linux News搬运工 1926
上一篇: LWN:IPE——用来确保只执行可信代码的security module!
下一篇: LWN:让Btrfs的数据改动需要预先经过认证!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值