内核跟线程相关的代码有两部分:
1、一部分跟平台相关,例如x86下,定义在arch/x86/kernel/process_32.c。提供的接口是kernel_thread。调用daemonize,可以为线程命名。
2、一部分跟平台无关,定义在kernel/kthread.c,在include/linux/kthread.h中声明。
1)定义宏kthread_run(threadfn, data, namefmt, ...):包装了kthread_create线程创建和wake_up_process线程运行。
2)kthread_create,根据调用者的参数内容,将信息整合到kthread_create_info中,然后注册到kthread_create_list链表中,然后唤醒kthreadd_task守护线程(该线程是其它所有创建的线程的祖先,为了让创建的内核子线程有一个干净的环境,该守护线程的上下文是干净的),具体执行的函数体为kthreadd。
3)kthreadd:在init/main.c中被创建,该线程不断监视kthread_create_list链表,若不为空则调用create_thread,根据kthread_create_info内容,创建线程。
4)create_thread:调用平台相关kernel_thread创建线程。但是,并不是以threadfn做为线程执行体,而是以kthread做为执行体。通过这层封装,可以更好地对threadfn行为,进行控制。
5)kthread:对struct kthread进行设置,该结构体用于控制线程的行为(在kthread_stop会改变该结构体中的值),并真正调用threadfn
参考资料:
阅读(873) | 评论(0) | 转发(0) |