Я начал изучать эти вещи недавно. По этому поводу я наткнулся на множество ресурсов, касающихся kprobes, BPF, eBPF, точек трассировки и 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, но он создавал некоторый джиттер. Когда я оценивал некоторые чувствительные к джиттеру задачи, я надеялся, что смогу использовать эту точку трассировки в модуле ядра.
Буду признателен за любые комментарии и предложения по этому поводу.
Спасибо, Кушал.
ну, одна из причин заключалась в том, что я не был так хорошо знаком с синтаксисом BPF. Кроме того, как я могу сохранить эти журналы в текстовый файл или CSV или что-то в этом роде?
См. этот учебник по скрытой копии для трассировки Linux. В частности, Урок 7 содержит пример того, как получить данные из ядра в пользовательском пространстве, которые затем можно сохранить в файл. Кроме того, в исходном коде модулей точек трассировки присутствует Примеры. Есть ли что-то конкретное, что вы хотели бы сделать в BPF, что я могу продемонстрировать? В противном случае я могу добавить пример сохранения в файл журнала, если это будет полезно.
Благодарю за ваш ответ. Я обновил фрагмент кода. Я хотел записать содержимое irq_rcv_stats в файл журнала, чтобы потом использовать его для вычисления джиттеров.
@pchaigno У меня вопрос по пример. Исходя из моего кода, чем мне заменить register_trace_subsys_event
? это register_trace_vector_irq_rcv
? Я попробовал. Я получаю сообщение об ошибке. Пожалуйста, дайте мне знать, если я делаю это неправильно.
Почему вы хотите использовать модуль ядра, если у вас уже есть работающее доказательство концепции с eBPF?