mirror of
https://github.com/eunomia-bpf/bpf-developer-tutorial.git
synced 2026-04-02 02:01:26 +08:00
Deploying to gh-pages from @ eunomia-bpf/bpf-developer-tutorial@57e0164e90 🚀
This commit is contained in:
@@ -299,12 +299,11 @@ int BPF_PROG(irq_handler_exit, int irq, struct irqaction *action)
|
||||
|
||||
char LICENSE[] SEC("license") = "GPL";
|
||||
</code></pre>
|
||||
<p>这段代码是一个 eBPF 程序,用于捕获和分析内核中硬件中断处理程序(hardirqs)的执行信息。程序的主要目的是获取中断处理程序的名称、执行次数和执行时间,并以直方图的形式展示执行时间的分布。让我们一步步分析这段代码。 </p>
|
||||
<p>这段代码是一个 eBPF 程序,用于捕获和分析内核中硬件中断处理程序(hardirqs)的执行信息。程序的主要目的是获取中断处理程序的名称、执行次数和执行时间,并以直方图的形式展示执行时间的分布。让我们一步步分析这段代码。</p>
|
||||
<ol>
|
||||
<li>包含必要的头文件和定义数据结构:</li>
|
||||
</ol>
|
||||
<pre><code class="language-c">
|
||||
#include <vmlinux.h>
|
||||
<li>
|
||||
<p>包含必要的头文件和定义数据结构:</p>
|
||||
<pre><code class="language-c">#include <vmlinux.h>
|
||||
#include <bpf/bpf_core_read.h>
|
||||
#include <bpf/bpf_helpers.h>
|
||||
#include <bpf/bpf_tracing.h>
|
||||
@@ -312,10 +311,10 @@ char LICENSE[] SEC("license") = "GPL";
|
||||
#include "bits.bpf.h"
|
||||
#include "maps.bpf.h"
|
||||
</code></pre>
|
||||
<p>该程序包含了 eBPF 开发所需的标准头文件,以及用于定义数据结构和映射的自定义头文件。 </p>
|
||||
<ol start="2">
|
||||
<li>定义全局变量和映射:</li>
|
||||
</ol>
|
||||
<p>该程序包含了 eBPF 开发所需的标准头文件,以及用于定义数据结构和映射的自定义头文件。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>定义全局变量和映射:</p>
|
||||
<pre><code class="language-c">
|
||||
#define MAX_ENTRIES 256
|
||||
|
||||
@@ -326,38 +325,42 @@ const volatile bool do_count = false;
|
||||
|
||||
...
|
||||
</code></pre>
|
||||
<p>该程序定义了一些全局变量,用于配置程序的行为。例如,<code>filter_cg</code> 控制是否过滤 cgroup,<code>targ_dist</code> 控制是否显示执行时间的分布等。此外,程序还定义了三个映射,分别用于存储 cgroup 信息、开始时间戳和中断处理程序的信息。 </p>
|
||||
<ol start="3">
|
||||
<li>定义两个辅助函数 <code>handle_entry</code> 和 <code>handle_exit</code>:</li>
|
||||
</ol>
|
||||
<p>这两个函数分别在中断处理程序的入口和出口处被调用。<code>handle_entry</code> 记录开始时间戳或更新中断计数,<code>handle_exit</code> 计算中断处理程序的执行时间,并将结果存储到相应的信息映射中。
|
||||
4. 定义 eBPF 程序的入口点:</p>
|
||||
<p>该程序定义了一些全局变量,用于配置程序的行为。例如,<code>filter_cg</code> 控制是否过滤 cgroup,<code>targ_dist</code> 控制是否显示执行时间的分布等。此外,程序还定义了三个映射,分别用于存储 cgroup 信息、开始时间戳和中断处理程序的信息。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>定义两个辅助函数 <code>handle_entry</code> 和 <code>handle_exit</code>:</p>
|
||||
<p>这两个函数分别在中断处理程序的入口和出口处被调用。<code>handle_entry</code> 记录开始时间戳或更新中断计数,<code>handle_exit</code> 计算中断处理程序的执行时间,并将结果存储到相应的信息映射中。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>定义 eBPF 程序的入口点:</p>
|
||||
<pre><code class="language-c">
|
||||
SEC("tp_btf/irq_handler_entry")
|
||||
int BPF_PROG(irq_handler_entry_btf, int irq, struct irqaction *action)
|
||||
{
|
||||
return handle_entry(irq, action);
|
||||
return handle_entry(irq, action);
|
||||
}
|
||||
|
||||
SEC("tp_btf/irq_handler_exit")
|
||||
int BPF_PROG(irq_handler_exit_btf, int irq, struct irqaction *action)
|
||||
{
|
||||
return handle_exit(irq, action);
|
||||
return handle_exit(irq, action);
|
||||
}
|
||||
|
||||
SEC("raw_tp/irq_handler_entry")
|
||||
int BPF_PROG(irq_handler_entry, int irq, struct irqaction *action)
|
||||
{
|
||||
return handle_entry(irq, action);
|
||||
return handle_entry(irq, action);
|
||||
}
|
||||
|
||||
SEC("raw_tp/irq_handler_exit")
|
||||
int BPF_PROG(irq_handler_exit, int irq, struct irqaction *action)
|
||||
{
|
||||
return handle_exit(irq, action);
|
||||
return handle_exit(irq, action);
|
||||
}
|
||||
</code></pre>
|
||||
<p>这里定义了四个 eBPF 程序入口点,分别用于捕获中断处理程序的入口和出口事件。<code>tp_btf</code> 和 <code>raw_tp</code> 分别代表使用 BPF Type Format(BTF)和原始 tracepoints 捕获事件。这样可以确保程序在不同内核版本上可以移植和运行。</p>
|
||||
</li>
|
||||
</ol>
|
||||
<p>Softirq 代码也类似,这里就不再赘述了。</p>
|
||||
<h2 id="运行代码"><a class="header" href="#运行代码">运行代码</a></h2>
|
||||
<p>eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 <a href="https://github.com/eunomia-bpf/eunomia-bpf">https://github.com/eunomia-bpf/eunomia-bpf</a> 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。</p>
|
||||
@@ -372,7 +375,7 @@ Packing ebpf object and config into package.json...
|
||||
<h2 id="总结"><a class="header" href="#总结">总结</a></h2>
|
||||
<p>在本章节(eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件)中,我们学习了如何使用 eBPF 程序捕获和分析内核中硬件中断处理程序(hardirqs)的执行信息。我们详细讲解了示例代码,包括如何定义数据结构、映射以及 eBPF 程序入口点,以及如何在中断处理程序的入口和出口处调用辅助函数来记录执行信息。</p>
|
||||
<p>通过学习本章节内容,您应该已经掌握了如何在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件的方法,以及如何分析这些事件以识别内核中的性能问题和其他与中断处理相关的问题。这些技能对于分析和优化 Linux 内核的性能至关重要。</p>
|
||||
<p>为了更好地理解和实践 eBPF 编程,我们建议您阅读 eunomia-bpf 的官方文档:https://github.com/eunomia-bpf/eunomia-bpf。此外,我们还为您提供了完整的教程和源代码,您可以在 https://github.com/eunomia-bpf/bpf-developer-tutorial 中查看和学习。希望本教程能够帮助您顺利入门 eBPF 开发,并为您的进一步学习和实践提供有益的参考。</p>
|
||||
<p>为了更好地理解和实践 eBPF 编程,我们建议您阅读 eunomia-bpf 的官方文档:<a href="https://github.com/eunomia-bpf/eunomia-bpf">https://github.com/eunomia-bpf/eunomia-bpf</a> 。此外,我们还为您提供了完整的教程和源代码,您可以在 <a href="https://github.com/eunomia-bpf/bpf-developer-tutorial">https://github.com/eunomia-bpf/bpf-developer-tutorial</a> 中查看和学习。希望本教程能够帮助您顺利入门 eBPF 开发,并为您的进一步学习和实践提供有益的参考。</p>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user