我一直在研究Linux内核的子系统。那里写着Linux内核负责上下文切换(让另一个进程使用CPU)。以下是内核执行上下文切换的步骤:
我的问题是我听不懂上面的第三步。有人可以说明一下这句话吗?谢谢!
- CPU(实际硬件)基于内部计时器中断当前进程,切换到内核模式,并将控制权移交给内核。
大多数任务切换是由任务阻塞引起的(因为它们必须等待互斥量,磁盘IO,用户IO,最终用户操作等)。>>
最好(更准确地说,“某事”(IRQ,系统调用)会导致在内核决定要执行任务切换之前切换到内核的代码,并且该“某事”不属于内核的一部分)。任务切换本身。
- 内核记录CPU和内存的当前状态,这对于恢复刚刚中断的进程至关重要。
排序。因为“某物”(IRQ,系统调用)会导致在内核决定执行任务切换之前切换到内核代码。所有任务仅在内核代码(针对一个任务)和内核代码(针对另一任务)之间切换。因为任务切换只能从内核代码切换到内核代码;任务开关本身不需要关心用户空间内存(这对于内核代码而言并不重要)或内核内存(由所有CPU和所有虚拟地址空间共享/共享)。更多;因为有些寄存器是“被调用者保留的”(通过C调用约定),而有些寄存器是“就内核而言是恒定的”(例如,段寄存器),所以任务切换代码也不需要关心CPU状态的各个部分。
- 内核执行上一个时间段内可能发生的任何任务(例如,从输入和输出或I / O操作中收集数据)。
也不是任务切换的一部分(更多“内核决定执行任务切换之前或之后发生的事情”)。
- 现在内核准备好让另一个进程运行。内核分析准备运行的进程列表,然后选择一个。
排序;但是它并不像列表那样简单,有时(例如,高优先级的实时线程取消阻止并抢占了次要的任务),内核无需执行任何其他操作即可知道需要切换到哪个任务。
- 内核为这个新进程准备了内存,然后准备了CPU。
用于记忆;内核通常只会加载新的“对新任务的虚拟地址空间的引用”(例如80x86上的单个
mov cr3, ...
指令)。对于CPU状态,这与上面的“2. The kernel records the current state of the CPU ...
”相反(正在加载以前保存的内容,其中某些CPU状态未加载且未保存)。
- 内核告诉CPU新进程的时间片将持续多长时间。
是
- 内核将CPU切换到用户模式,并将CPU的控制权交给进程。
不是。最好(更准确地说)是在内核完成任务切换之后,新任务的内核代码会执行所需的任何操作(并最终可能返回用户空间)。并且“任务切换完成后发生的事情”不属于任务切换的一部分。