* 进程A执行执行kthread_create()函数中的wait_for_completion(create->done)后进入睡眠, 一直持续到创建的内核线程的第一次执行才被唤醒。
* 补充: 或者是create_kernel()执行kernel_thread()创建进程描述符时失败,也一样会complete(create->done).触发进程A的唤醒(内核线程创建失败).
现在新的内核线程已经创建好了,唯一要等待的是新内核线程获得cpu开始执行.前面提到他第一个要执行的函数便是ip寄存器中的kthread_thread_helper()函数.这个函数最终会[CALL %si], 也就是调用了kthread().
内核线程kt获得人生第一次的cpu执行权的实际任务就是执行complete(create->done)来通知创建它的进程A, “他已经创建好了”,然后就进入了睡眠。 所以创建内核线程的进程A必须要唤醒kt,才能开始内核线程的工作。
kt = kthread_create(...,...,...);
wake_up_process(kt); //唤醒kt内核线程.
至此内核线程kt和进程A便各走各的人生路.