нахождение количества процессорного времени, затраченного на процедуры ядра - PullRequest
0 голосов
/ 02 ноября 2011

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

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

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

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

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

    write_lock_irq(&tasklist_lock);
    for_each_process(p) {
            if (task_cpu(p) == cpu && p->state == TASK_RUNNING &&
                (!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(&tasklist_lock);
}

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

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

2 голосов
/ 02 ноября 2011

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

...