我最近开始学习这些东西。关于这个问题,我发现了大量关于 kprobes、BPF、eBPF、tracepoints 和 perf 的资源。
我想测试内核中的一些 irq 事件(在它到达设备驱动程序之前)。因此,我在 do_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;
}
"""
...
在这里,我正在侦听特定 IRQ 编号上的 IRQ 事件。这对我来说效果很好,暂时。
现在,我试图将这个跟踪点附加到内核模块中(就像我们在内核模块中附加 kprobe 的方式一样)。这甚至可能吗?目前,我为此使用了 perf,但它产生了一些抖动。当我评估一些对抖动敏感的任务时,我希望我可以在内核模块中使用这个跟踪点。
我将不胜感激有关此事的任何意见或建议。
谢谢,库沙尔。