内核必须在上下文切换之间保存什么内存"状态"?

lon*_*oat 2 linux memory-management linux-kernel

我目前正在阅读Linux如何工作:超级用户应该知道的内容,并且我阅读了以下有关上下文切换的内容:

  1. CPU(实际硬件)基于内部模块中断当前进程,切换到内核模式,并将控制权交还给内核.
  2. 内核记录CPU和内存的当前状态,这对于恢复刚刚中断的进程至关重要.
  3. 内核执行在前一个时间片期间可能出现的任何任务(例如从输入和输出或I/O操作中收集数据).
  4. 内核现在准备让另一个进程运行.内核分析准备运行的进程列表并选择一个进程.
  5. 内核为这个新进程准备内存,然后准备CPU.
  6. 内核告诉CPU新进程的时间片将持续多长时间.
  7. 内核将CPU切换到用户模式,并将CPU控制到进程.

我理解需要从CPU的状态(寄存器值等)中保存什么,但我不明白需要管理什么内存.进程是否有自己的内存块,应该不受上下文切换的影响?

内核需要在上下文切换之间保存内存怎么样?

mis*_*mer 5

在具有内存管理单元(MMU)的处理器上,在关于内存的任务切换期间发生的主要事情是告诉MMU使用不同的虚拟地址空间.这假设目标任务具有不同的地址空间,即任务是不同的进程而不是同一进程中的不同线程.例如,在32位x86上,控制寄存器3(CR3)包含页面目录表的物理地址.在任务切换到不同进程期间,目标进程的相应CR3值将加载到CR3中,因此所有进一步的虚拟内存访问都使用新的地址空间.

内存本身通常不以任何方式保存,因为MMU用于保护页面,因此一个进程通常不能访问另一个进程内存.我总的说是因为有一些情况允许这样做,但这与这个问题无关.

在内存受限的系统中,当需要更多虚拟内存且没有更多空闲物理内存时,内存页面可以存储到辅助存储(例如硬盘驱动器),但这通常不会在上下文切换期间完成(尽管它可以)而是在需求的基础上完成.无论哪种方式,将存储器存储到二级存储器都不是上下文切换的重要部分.

所以最后关于以下声明

内核记录CPU和内存的当前状态,这对于恢复刚刚中断的进程至关重要.

如果通过"内存",该语句指的是控制虚拟到物理地址转换的MMU状态,那么在上下文切换期间可以保存该状态.我说可能是因为通常进程的CR3值没有改变所以没有理由保存它,因为它已经知道了.如果语句指的是任务使用的实际内存,那么它是错误的.

最后关于以下声明:

内核为这个新进程准备内存,然后准备CPU.

再次,如果通过"为新进程准备内存",则意味着设置MMU以使用新的虚拟到物理地址转换,然后在上下文切换期间确实发生.如果它意味着它从某个地方为新进程加载内存,那么由于MMU,这不需要发生.