Linux 内核在内核空间中时所处的上下文

Linux 内核在内核空间中时所处的上下文,linux,linux-kernel,Linux,Linux Kernel,以下摘录摘自Robert Love的Linux内核开发(LKD) 这些上下文表示内核活动的广度。在里面 事实上,在Linux中,我们可以概括为每个处理器都在精确地执行任务 在任何给定时刻的三件事之一: 在用户空间中,在进程中执行用户代码 在内核空间中,在进程上下文中,代表特定进程执行 在内核空间中,在中断上下文中,与进程无关,处理中断 这份清单包括在内。即使是角落的情况下适合这三个之一 活动:例如,当空闲时,内核是 在内核的进程上下文中执行空闲进程 我从上面学到的是,在内核空间中,只有两个上下文

以下摘录摘自Robert Love的Linux内核开发(LKD)

这些上下文表示内核活动的广度。在里面 事实上,在Linux中,我们可以概括为每个处理器都在精确地执行任务 在任何给定时刻的三件事之一:

  • 在用户空间中,在进程中执行用户代码
  • 在内核空间中,在进程上下文中,代表特定进程执行
  • 在内核空间中,在中断上下文中,与进程无关,处理中断
  • 这份清单包括在内。即使是角落的情况下适合这三个之一 活动:例如,当空闲时,内核是 在内核的进程上下文中执行空闲进程

    我从上面学到的是,在内核空间中,只有两个上下文(根据Love,它是包含的),即进程上下文和中断上下文。据我所知,当进程调用系统调用(例如read()、write()等)时,内核进入进程上下文,而当内核处理中断时,中断上下文发生

    但是内核中还有更多的其他功能,例如,有一些内核线程被安排执行例行工作(例如,回收内存),甚至调度器本身也不是通过系统调用或中断来调用的


    所以我想知道为什么文本中说内核中只有两个上下文…?

    上下文中最重要的部分是地址空间(或虚拟内存)和cpu状态(如寄存器值、程序计数器等)。从这个角度来看,应该有另外两种上下文:内核上下文和内核线程上下文

    内核本身在内核空间中运行,不依赖于任务(包括正常进程和内核线程)。它的上下文称为空闲上下文或交换上下文

    内核线程也不依赖于任何正常的进程上下文。它们的调度与普通任务类似,具有不同的cpu状态,但共享相同的地址空间。实际上,所有任务共享相同的内核空间部分,这与空闲上下文的内核部分相同。这就是为什么在将正常进程切换到内核线程或在内核线程之间切换时不需要更改地址空间(或mm)的原因


    事实上,中断上下文与内核上下文和内核线程上下文的类型完全相同:它们不依赖于任何正常的进程上下文。中断是完全异步的,所以在它的上下文中不存在中断任务上下文的假设。我想这就是为什么Robert Love说只有两种上下文:进程上下文和其他上下文。

    即使调度程序本身既不是由系统调用也不是由中断调用的-那么您认为它什么时候被调用?它在两种情况下都会被调用,一种是当进程产生()时,另一种是当中断触发时<代码>计划执行例行工作(例如,回收内存)的内核线程
    内核处理由上半部分和下半部分工作组成。顶层在中断中完成(寄存器执行例行工作),而低端(执行路由工作)在低端执行。