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