C - Linux - Пользовательский модуль ядра для итерации по процессу, который дочерние элементы взрывают, журнал ядра и компьютер - PullRequest
1 голос
/ 30 марта 2019

Я новичок в модулях ядра Linux и пытаюсь реализовать некоторые базовые концепции, прежде чем обращаться со сложными. Я написал код, который принимает параметр модуля (int) и проверяет, есть ли процесс с этим pid. Если он есть, он берет своих потомков в виде списка и перебирает его, печатая идентификаторы и описания детей. Вот код:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/moduleparam.h>
#include <linux/sched/signal.h>

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Some guy");

int mypid = 0;

static int simple_init(void)
{

    struct task_struct *task;
    struct list_head *list;

    printk(KERN_ALERT "Loading Module\nThe process id: %d\n", mypid);


    for_each_process(task){
        printk(KERN_ALERT "PID/NAME: %d/%s\n", task->pid, task->comm);

        if(task->pid == mypid){

            printk(KERN_ALERT "The common pid found: %d/%s\n", task->pid, task->comm);


            list_for_each(list, &task->children){

            task = list_entry(list, struct task_struct, sibling);               
                //printk(KERN_INFO "Parent ID/NAME: %d/%s\n", task->parent->pid, task->parent->comm);               
                printk(KERN_ALERT "Child PID/NAME: %d/%s\n", task->pid, task->comm);
            }

    } 


    return 0;

}


static void simple_exit(void){

    printk(KERN_WARNING "Removing Module\n");

}

module_init(simple_init);
module_exit(simple_exit);
module_param(mypid, int, 0);

Однако, когда я запускаю этот код с

sudo insmod listtasks.ko mypid=1800(or a random pid)

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

С уважением,

1 Ответ

2 голосов
/ 30 марта 2019

Я исправил проблему с инициализацией новой task_struct с именем childtask:

struct task_struct *childtask;

и затем присвоение его списку list_entry внутри цикла list_for_each:

childtask = list_entry(list, struct task_struct, sibling);  

так что задача и дочерняя задача - это разные указатели.

...