Linux kernel 如何在内核模块中使用跟踪点
我最近开始学习这些东西。关于这个问题,我遇到了很多关于kprobes、BPF、eBPF、跟踪点和性能的资源 我想在内核中测试一些irq事件(在它到达设备驱动程序之前)。因此,我在do_IRQ()函数的内核中创建了一个跟踪事件 我已在内核中将我的跟踪点声明为:Linux kernel 如何在内核模块中使用跟踪点,linux-kernel,kernel-module,bpf,tracepoint,Linux Kernel,Kernel Module,Bpf,Tracepoint,我最近开始学习这些东西。关于这个问题,我遇到了很多关于kprobes、BPF、eBPF、跟踪点和性能的资源 我想在内核中测试一些irq事件(在它到达设备驱动程序之前)。因此,我在do_IRQ()函数的内核中创建了一个跟踪事件 我已在内核中将我的跟踪点声明为: TRACE_EVENT(vector_irq_rcv, TP_PROTO(unsigned int vector, unsigned int irq), TP_ARGS(vector, irq),
TRACE_EVENT(vector_irq_rcv,
TP_PROTO(unsigned int vector, unsigned int irq),
TP_ARGS(vector, irq),
TP_STRUCT__entry(
__field( unsigned int, vector )
__field( unsigned int, irq )
),
TP_fast_assign(
__entry->vector = vector;
__entry->irq = irq;
),
TP_printk("irq=%u cpu=%u",
__entry->irq, __entry->vector)
);
为了检查这一点,我使用eBPF尝试了以下代码片段
...
bpf_text = """
#include <linux/netdevice.h>
#include <uapi/linux/ptrace.h>
typedef struct my_stats {
u32 irq;
u32 ts;
} my_stat;
BPF_HASH(irq_rcv_stats, u32, my_stat);
TRACEPOINT_PROBE(irq_vectors, vector_irq_rcv) {
if(!(args->irq == 65)) return 0;
u32 pid = bpf_get_current_pid_tgid();
my_stat val = {};
val.ts = bpf_ktime_get_ns();
val.irq = args->irq;
irq_rcv_stats.update(&pid, &val);
// bpf_trace_printk("IRQ %d encountered ; Vector = %d \\n", args->irq, args->vector);
return 0;
}
"""
...
。。。
bpf_text=“”
#包括
#包括
typedef struct my_stats{
u32 irq;
u32 ts;
}我的_统计;
BPF_散列(irq_rcv_统计、u32、my_统计);
跟踪点探测(irq\U矢量、矢量irq\U rcv){
如果(!(args->irq==65))返回0;
u32 pid=bpf_get_current_pid_tgid();
my_stat val={};
val.ts=bpf_ktime_get_ns();
val.irq=args->irq;
irq_rcv_stats.update(&pid,&val);
//bpf_trace_printk(“遇到IRQ%d;向量=%d\\n”,参数->IRQ,参数->向量);
返回0;
}
"""
...
在这里,我正在收听特定IRQ号码上的IRQ事件。目前,这对我来说很有效
现在,我试图在内核模块中附加这个跟踪点(就像我们在内核模块中附加kprobe一样)。这可能吗?
目前,我已经为此使用了perf,但它产生了一些抖动。在评估一些抖动敏感任务时,我希望可以在内核模块中使用这个跟踪点
如果您能就此问题提供任何意见或建议,我将不胜感激
谢谢,
Cooshal.如果你已经有了eBPF的概念证明,为什么要使用内核模块?一个原因是我对BPF语法不太熟悉。此外,如何将这些日志保存到文本文件或csv或类似文件中?请参阅Linux跟踪。特别是,第7课包含了一个如何在用户空间中从内核检索数据的示例,然后可以将其保存到文件中。此外,内核的源代码中还有跟踪点模块。在BPF中,您有什么特别想做的,我可以演示一下吗?如果有用的话,我可以添加一个保存到日志文件的示例。谢谢您的回复。我已经更新了代码片段。我想把irq_rcv_stats的内容写入一个日志文件,以便以后可以用它来计算抖动。@pchaigno我有一个关于这个问题的问题。根据我的代码,我应该用什么替换
register\u trace\u subsys\u event
?它是寄存器\跟踪\向量\ irq \ rcv
?我试过了。我得到一个声明错误。如果我做错了,请告诉我。