系统调用在调用进程内执行,中断可以在任何进程内执行(当中断发生时,中断处理程序在当前正在运行的进程内执行)但是kthreads在哪里执行?我们假设当前正在内核模式下执行的某些函数调用kthreads_create
.这应该会产生新的内核线程,但是它的执行上下文是什么?抱歉,如果您认为我的问题是虚拟的,我绝对是 Linux 内核的新手
答案1
内核线程获得自己的进程上下文。内核线程按以下方式列出ps
:
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 May29 ? 00:00:44 /sbin/init
root 2 0 0 May29 ? 00:00:00 [kthreadd]
root 3 2 0 May29 ? 00:00:05 [ksoftirqd/0]
root 5 2 0 May29 ? 00:00:00 [kworker/0:0H]
root 7 2 0 May29 ? 00:00:01 [migration/0]
root 8 2 0 May29 ? 00:02:57 [rcu_preempt]
root 9 2 0 May29 ? 00:00:00 [rcu_bh]
root 10 2 0 May29 ? 00:00:00 [rcu_sched]
root 11 2 0 May29 ? 00:00:00 [watchdog/0]
root 12 2 0 May29 ? 00:00:00 [watchdog/1]
...
[方括号]中的所有进程名称均指内核线程。
也可以看看https://lwn.net/Articles/65178/。kthread_create
只是创建一个数据结构。然后将该数据结构传递给wake_up_process
运行该进程的 。
看来内核文档使用术语过程,线和任务相当松散并且或多或少可以互换。
答案2
内核线程与普通进程类似,但有以下两个区别:(1)内核线程在内核模式下运行,(2)它们没有自己的地址空间。正如其名称所示,内核线程不会转换到用户空间,而是继续在内核模式下运行。每个内核线程都有自己的堆栈,但地址空间与内核的其余部分共享。在这方面,它们就像用户空间线程,但当然有区别,用户空间线程位于它们启动的用户级进程的地址空间中。