1.kernel thread是否只有在kernel thred中才被创建?
2.kernel thread无法被kill?
3.在module中创建的kernel thread,用kernel_thread函数,获得的current->mm为什么不为0 ?
4.
先看一段代码:
#include <linux/kernel.h>
#include <linux/module.h>
static pid_t thread_pid;
static struct completion thread_exited;
static int noop(void *dummy)
{
daemonize("mythread");
allow_signal(SIGTERM);
while (!signal_pending (current)) {
/* do something else */
schedule();
}
complete_and_exit(&thread_exited, 1);
}
static int test_init(void)
{
init_completion(&thread_exited);
thread_pid = kernel_thread(noop, NULL, CLONE_KERNEL | SIGCHLD);
return 0;
}
static void test_exit(void)
{
kill_proc (thread_pid, SIGTERM, 1);
wait_for_completion(&thread_exited);
}
module_init(test_init);
module_exit(test_exit);
回答问题:
1.从上面的例子中可以看到,kernel thread的创建不一定要在kernel thread中。
2.在insmod上面的module之后,killall mythread 当然可以杀死这个kernel thread。
3.从上面的printk函数的输出我们已经看到 current->mm 确实是为0的,毫无疑问。
但是,mm不为0的原因在哪里呢?
kernel thread中没有调用daemonize()函数,该函数给kernel thread 命名,并且会挂入kthread线程的列队上去。当mm输出不为0的时候其实输出的mm指向的是insmod的mm
总结:
kernel_thread创建,在执行函数里面必须用daemonize释放资源并挂到init下。
kthread_create是比较正牌的创建函数,这个不必要调用daemonize,用这个创建的kernel thread都挂在了kthread线程下。