#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)
т. Е. Нигде в источниках нет. Добавление этого и перекомпиляция ядра позволят вашему модулю ядра динамически связываться).