上一篇文章中分析了Linux内核idle进程(pid=0)的启动启动过程,并且创建了kthreadd 进程和init进程。init进程较为复杂,放在下一篇分析。本文就先分析kthreadd进程的启动过程。
1、kthreadd的创建
kthreadd定义在 Kernel\kernel\kthread.c
在上文中得知,kthreadd进程在rest_init()中被创建。task_struct结构体是进程描述符,里面包括了pid thread_info和state 进程状态等信息。
状态 | 描述 |
TASK_RUNNING | 表示进程正在执行或者处于准备执行的状态 |
TASK_INTERRUPTIBLE | 进程因为等待某些条件处于阻塞(挂起状态),一旦等待的条件成立,进程便会从该状态转化成就绪状态 |
TASK_UNINTERRUPTIBLE | 意思与TASK_INTERRUPTIBLE类似,但是我们传递任意信息等不能唤醒他们,只有它所等待的资源可用的时候,才会被唤醒 |
TASK_STOPPED | 进程被停止执行 |
TASK_TRACED | 进程被debugger等进程所监视 |
EXIT_ZOMBIE | 进程的执行被终止,但是其父进程还没有使用wait()等系统调用来获知它的终止信息,此时进程成为僵尸进程 |
EXIT_DEAD | 进程被杀死,即进程的最终状态 |
TASK_KILLABLE | 当进程处于这种可以终止的新睡眠状态中,他的运行原理类似于TASK_UNINTERRUPTIBLE,只不过可以响应致命信号 |