关于"kernel process"的疑问
Doubts about a "kernel process"
实际上,我不太了解的概念之一是 'kernel porocess' 或内核线程。在网上搜索并在 SOO 中搜索类似问题时,我发现了以下内容:What is a Kernel thread? 答案是:
A kernel thread is a kernel task running only in kernel mode
据我所知,要进入 'kernel mode' 的进程必须发出系统调用。所以我不明白这些线程如何一直处于这种模式运行。有人可以帮助我了解这是如何工作的吗?
内核线程是只能由另一个内核线程创建的线程(已经在 "kernel mode" - 也许某些驱动程序可以产生它们来为它们做一些清理或监视),所以没有用户线程可以启动with(并使用系统调用切换上下文),并且这些线程在内核地址space内启动,因此它们不需要任何额外的东西就可以进入内核模式。
创建的内核线程以普通优先级和调度程序功能作为用户线程运行。来自 kthread_create_on_node
(http://lxr.free-electrons.com/source/kernel/kthread.c#L269):
310 task = create->result;
311 if (!IS_ERR(task)) {
312 static const struct sched_param param = { .sched_priority = 0 };
313 va_list args;
314
315 va_start(args, namefmt);
316 vsnprintf(task->comm, sizeof(task->comm), namefmt, args);
317 va_end(args);
318 /*
319 * root may have changed our (kthreadd's) priority or CPU mask.
320 * The kernel thread should not inherit these properties.
321 */
322 sched_setscheduler_nocheck(task, SCHED_NORMAL, ¶m);
323 set_cpus_allowed_ptr(task, cpu_all_mask);
324 }
实际上,我不太了解的概念之一是 'kernel porocess' 或内核线程。在网上搜索并在 SOO 中搜索类似问题时,我发现了以下内容:What is a Kernel thread? 答案是:
A kernel thread is a kernel task running only in kernel mode
据我所知,要进入 'kernel mode' 的进程必须发出系统调用。所以我不明白这些线程如何一直处于这种模式运行。有人可以帮助我了解这是如何工作的吗?
内核线程是只能由另一个内核线程创建的线程(已经在 "kernel mode" - 也许某些驱动程序可以产生它们来为它们做一些清理或监视),所以没有用户线程可以启动with(并使用系统调用切换上下文),并且这些线程在内核地址space内启动,因此它们不需要任何额外的东西就可以进入内核模式。
创建的内核线程以普通优先级和调度程序功能作为用户线程运行。来自 kthread_create_on_node
(http://lxr.free-electrons.com/source/kernel/kthread.c#L269):
310 task = create->result;
311 if (!IS_ERR(task)) {
312 static const struct sched_param param = { .sched_priority = 0 };
313 va_list args;
314
315 va_start(args, namefmt);
316 vsnprintf(task->comm, sizeof(task->comm), namefmt, args);
317 va_end(args);
318 /*
319 * root may have changed our (kthreadd's) priority or CPU mask.
320 * The kernel thread should not inherit these properties.
321 */
322 sched_setscheduler_nocheck(task, SCHED_NORMAL, ¶m);
323 set_cpus_allowed_ptr(task, cpu_all_mask);
324 }