Linux kernel 什么是kthread_任务

Linux kernel 什么是kthread_任务,linux-kernel,Linux Kernel,在kthread_create的定义中,当一个任务被唤醒时,有人知道这个任务在做什么吗 struct task_struct *kthread_create { struct kthread_create_info create; create.threadfn = threadfn; create.data = data; init_completion(&create.done); spin_lock(&kthread_cre

在kthread_create的定义中,当一个任务被唤醒时,有人知道这个任务在做什么吗

struct task_struct *kthread_create

{


    struct kthread_create_info create;

    create.threadfn = threadfn;
    create.data = data;
    init_completion(&create.done);

    spin_lock(&kthread_create_lock);
    list_add_tail(&create.list, &kthread_create_list);
    spin_unlock(&kthread_create_lock);

    **wake_up_process(kthreadd_task);**
    wait_for_completion(&create.done);

    if (!IS_ERR(create.result)) {
            struct sched_param param = { .sched_priority = 0 };
            va_list args;

            va_start(args, namefmt);
            vsnprintf(create.result->comm, sizeof(create.result->comm),
                      namefmt, args);
            va_end(args);
            /*
             * root may have changed our (kthreadd's) priority or CPU mask.
             * The kernel thread should not inherit these properties.
             */
            sched_setscheduler_nocheck(create.result, SCHED_NORMAL, &param);
            set_cpus_allowed_ptr(create.result, cpu_all_mask);
    }
    return create.result;
}

kthread_task
是指向内核线程runnind
kthread()函数的
task_struct
的指针

kthreadd()
是守护进程
kthreadd
的主函数(和主循环),它是一个内核线程守护进程,是所有其他内核线程的父线程


因此,在引用的代码中,创建了对kthread守护进程的请求。为了满足这个请求,kthread将读取它并启动一个内核线程。然后它将更改标志。在代码中,您有一个等待此标志。更改标志后,您的函数将检查新kthread创建的状态。

kthread是一个内核守护进程,它在内核引导期间启动

init/main.c ---> kernel_thread(kthreadd,...)

(architecture dependent code for e.g arch/arm/kernel/process.c)
正如您在这里看到的,
kernel\u thread()
返回一个
pid
。从
pid
中,我们确定
task_结构
,并将其分配给
kthread_任务

因此,每当调用创建内核线程时,即,
kthread\u create()
kthread\u task
被唤醒,inturn调用
kthread()
(在
kernel/kthread.c
中定义)