2010-11-12 23 views
5

W definicji kthread_create zadanie jest zbudzone, czy ktoś wie, co robi to zadanie?Co to jest kthreadd_task

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; 
} 

Odpowiedz

3

kthreadd_task jest wskaźnik task_struct nici jądra runnind kthreadd() funkcję zdefiniowaną w http://lxr.linux.no/#linux+v2.6.36/kernel/kthread.c#L231

kthreadd() jest główną funkcją (i główny pętelkowa) demon kthreadd co jądro gwint demon rodzic wszystkim inne wątki jądra.

Tak więc w cytowanym kodzie istnieje żądanie utworzenia demona kthreadd. Aby spełnić tę prośbę, kthreadd odczyta ją i uruchom wątek jądra. Wtedy zmieni flagę. W kodzie masz czekanie na tę flagę. Po zmianie flagi twoja funkcja sprawdzi status nowego stworzenia ktwego.

2

kthreadd to demon jądra, jest uruchamiany podczas rozruchu jądra.

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

(architecture dependent code for e.g arch/arm/kernel/process.c) 

Jak widać tutaj, kernel_thread() zwraca pid. Od pid określamy task_struct i przypisujemy go do kthreadd_task.

więc, gdy wywołanie do tworzenia nici jądra tj kthread_create(), kthreadd_task jest obudzić się, co wywołuje inturn kthreadd() (zdefiniowane w kernel/kthread.c).