在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, ¶m);
set_cpus_allowed_ptr(create.result, cpu_all_mask);
}
return create.result;
}
答案 0 :(得分:4)
kthreadd是一个内核守护进程,它在内核启动期间启动。
init/main.c ---> kernel_thread(kthreadd,...)
(architecture dependent code for e.g arch/arm/kernel/process.c)
正如您在此处所见,kernel_thread()
会返回pid
。从pid
开始,我们确定task_struct
并将其分配给kthreadd_task
。
因此,无论何时唤醒内核线程的创建,即kthread_create()
,kthreadd_task
,都会调用kthreadd()
(在kernel/kthread.c
中定义)。
答案 1 :(得分:3)
kthreadd_task
是http://lxr.linux.no/#linux+v2.6.36/kernel/kthread.c#L231定义的内核线程runnind task_struct
函数kthreadd()
的指针
kthreadd()
是守护进程kthreadd
的主要功能(和主循环),它是一个内核线程守护进程,是所有其他内核线程的父进程。
因此,在引用的代码中,创建了对kthreadd守护程序的请求。为了满足此请求,kthreadd将读取它并启动内核线程。然后它会改变旗帜。在代码中,你有一个等待这个标志。标记更改后,您的函数将检查新kthread创建的状态。