нахождение количества процессорного времени, затраченного процессом на подпрограммы ядра

#linux-kernel #kernel-module

#linux-ядро #kernel-module

Вопрос:

Я создаю модуль ядра для Linux. Мне это нужно, чтобы проверить, сколько времени каждый процесс провел внутри процедур ядра. Я знаю, что ядро хранит эту информацию внутри stime в task_struct . Моя проблема в том, что я не уверен, как я получаю эту информацию в свой модуль для каждого процесса. должен ли я создавать task_struct в своем модуле? Как мне получить информацию от каждого процесса?

Ответ №1:

Посмотрите на файл linux/kernel/taskstats.c, как он собирает данные из запущенных задач. Возможно, вы можете повторно использовать часть кода.

Ответ №2:

Повторение всех процессов из модуля ядра Linux немного сложно, потому что ядро может экспортировать не все необходимые символы. Возможно, вам потребуется немного модифицировать ядро и / или зависеть от более глубоких API для этой работы, что обычно не выполняется модулями ядра.

Давайте рассмотрим пример из существующего кода ядра. Linux 2.6.39, kernel/cpu.c:

 static inline void check_for_tasks(int cpu)
{
    struct task_struct *p;

    write_lock_irq(amp;tasklist_lock);
    for_each_process(p) {
            if (task_cpu(p) == cpu amp;amp; p->state == TASK_RUNNING amp;amp;
                (!cputime_eq(p->utime, cputime_zero) ||
                 !cputime_eq(p->stime, cputime_zero)))
                    printk(KERN_WARNING "Task %s (pid = %d) is on cpu %d "
                            "(state = %ld, flags = %x)n",
                            p->comm, task_pid_nr(p), cpu,
                            p->state, p->flags);
    }
    write_unlock_irq(amp;tasklist_lock);
}
 

Эта функция выполняет итерацию списка задач. Конечно, для вашего использования вы можете использовать блокировку чтения вместо блокировки записи, если вы не изменяете список.

Обратите внимание, что tasklist_lock это не экспортируется ( EXPORT_SYMBOL(tasklist_lock) т. Е. Нигде в источниках нет. Добавление этого и перекомпиляция ядра позволят вашему модулю ядра динамически связываться).