Как использовать точки трассировки в модуле ядра

Я начал изучать эти вещи недавно. По этому поводу я наткнулся на множество ресурсов, касающихся 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, но он создавал некоторый джиттер. Когда я оценивал некоторые чувствительные к джиттеру задачи, я надеялся, что смогу использовать эту точку трассировки в модуле ядра.

Буду признателен за любые комментарии и предложения по этому поводу.

Спасибо, Кушал.

Почему вы хотите использовать модуль ядра, если у вас уже есть работающее доказательство концепции с eBPF?

pchaigno 02.05.2018 06:42

ну, одна из причин заключалась в том, что я не был так хорошо знаком с синтаксисом BPF. Кроме того, как я могу сохранить эти журналы в текстовый файл или CSV или что-то в этом роде?

Cooshal 02.05.2018 12:33

См. этот учебник по скрытой копии для трассировки Linux. В частности, Урок 7 содержит пример того, как получить данные из ядра в пользовательском пространстве, которые затем можно сохранить в файл. Кроме того, в исходном коде модулей точек трассировки присутствует Примеры. Есть ли что-то конкретное, что вы хотели бы сделать в BPF, что я могу продемонстрировать? В противном случае я могу добавить пример сохранения в файл журнала, если это будет полезно.

pchaigno 02.05.2018 12:44

Благодарю за ваш ответ. Я обновил фрагмент кода. Я хотел записать содержимое irq_rcv_stats в файл журнала, чтобы потом использовать его для вычисления джиттеров.

Cooshal 02.05.2018 12:51

@pchaigno У меня вопрос по пример. Исходя из моего кода, чем мне заменить register_trace_subsys_event? это register_trace_vector_irq_rcv? Я попробовал. Я получаю сообщение об ошибке. Пожалуйста, дайте мне знать, если я делаю это неправильно.

Cooshal 02.05.2018 16:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
740
0

Другие вопросы по теме