以下摘录来自Robert Love的Linux Kernel Development(LKD)。
这些上下文表示内核活动的广度。在 实际上,在Linux中,我们可以概括地说,每个处理器的性能 在任何给定时刻的三件事之一:
- 在用户空间中,在进程中执行用户代码
- 在内核空间中,在进程上下文中,代表特定进程执行
- 在内核空间中,在与进程无关的中断上下文中,处理中断
此列表包含在内。即使是角落情况也适合这三种情况之一 活动:例如,空闲时,结果表明内核是 在内核的进程上下文中执行空闲进程。
我从上面掌握的是,在内核空间中,只有两个上下文(根据Love的说法,这是包含在内的),即进程上下文和中断上下文。据我了解,内核在进程调用系统调用(例如read(),write()等)时进入进程上下文,而中断上下文在内核处理中断时发生。
但是内核中还有更多其他功能,例如,有安排执行日常工作(例如回收内存)的内核线程,甚至调度程序本身都不是由系统调用或中断来调用的。
所以我想知道为什么文本说内核中只有两个上下文...?
答案 0 :(得分:1)
上下文的最重要部分是地址空间(或虚拟内存)和cpu状态(如寄存器值,程序计数器等)。从这个角度来看,应该有另外两种上下文:内核上下文和内核线程上下文。
内核本身在内核空间中运行不依赖于任务(包括正常进程和内核线程)。它的上下文称为空闲上下文或交换器上下文。
内核线程也不依赖任何正常的进程上下文。它们像正常任务一样被调度,具有不同的cpu状态,但是共享相同的地址空间。实际上,所有任务共享相同的内核空间部分,与空闲上下文的内核部分相同。这就是为什么在将正常进程切换到内核线程或在内核线程之间切换时无需更改地址空间(或mm)的原因。
实际上,中断上下文与内核上下文和内核线程上下文是完全相同的类型:它们不依赖任何正常的进程上下文。中断是完全异步的,因此在其上下文中没有中断任务上下文的假设。我认为这就是罗伯特·洛夫(Robert Love)说只有两种上下文的原因:过程上下文和其他。