Operating system 当操作系统进入内核模式时会发生什么?

Operating system 当操作系统进入内核模式时会发生什么?,operating-system,kernel,Operating System,Kernel,我发现无论是我的课本还是我的谷歌搜索技能都不能给我一个正确的答案。我知道这取决于操作系统,但有一点需要注意:会发生什么,为什么会发生? 我的教科书说,系统调用会导致操作系统进入内核模式,因为它还没有进入内核模式。这是必需的,因为内核模式控制I/O设备和特定进程地址空间之外的其他东西。但如果我理解正确,切换到内核模式并不一定意味着进程上下文切换(在这里,您将进程的当前状态保存到CPU以外的其他位置,以便其他进程可以运行) 为什么会这样?我有点认为一些“管理”进程被切换进来,负责进程的系统调用,并将

我发现无论是我的课本还是我的谷歌搜索技能都不能给我一个正确的答案。我知道这取决于操作系统,但有一点需要注意:会发生什么,为什么会发生?

我的教科书说,系统调用会导致操作系统进入内核模式,因为它还没有进入内核模式。这是必需的,因为内核模式控制I/O设备和特定进程地址空间之外的其他东西。但如果我理解正确,切换到内核模式并不一定意味着进程上下文切换(在这里,您将进程的当前状态保存到CPU以外的其他位置,以便其他进程可以运行)

为什么会这样?我有点认为一些“管理”进程被切换进来,负责进程的系统调用,并将结果发送到进程的地址空间,但我猜我错了。我似乎无法理解在切换到内核模式和从内核模式切换到内核模式时实际发生了什么,以及这如何影响进程在I/O设备上操作的能力

非常感谢:)


编辑:附加问题:库调用是否一定以系统调用结束?如果没有,您是否有任何库调用的示例不会在系统调用中结束?如果是,为什么要进行库调用?

历史上,系统调用是在中断的情况下发出的。Linux使用
0x80
向量,Windows使用
0x2F
向量访问系统调用,并将函数索引存储在
eax
寄存器中。最近,我们开始使用
SYSENTER
SYSEXIT
指令。用户应用程序在
Ring3
或userspace/usermode下运行。CPU在这里非常棘手,从内核模式切换到用户模式需要特别小心。它实际上包括在发出名为
iret
的特殊指令时,愚弄CPU,使其认为它来自用户模式。从usermode返回kernelmode的唯一方法是通过中断或前面提到的
syscenter/EXIT
指令对。它们都使用一种特殊的结构,简称为
TaskStateSegment
TSS
。这些允许CPU找到内核堆栈的位置,因此是的,它本质上需要一个任务切换

但到底发生了什么?
当您发出系统调用时,CPU将查找
TSS
,获取其
esp0
值,该值是内核的堆栈指针,并将其放入
esp
。然后CPU在另一种特殊结构中查找中断向量的索引,简称为
interruptdescriptorable
IDT
,并找到一个地址。此地址是处理系统调用的函数所在的位置。CPU为
int
指令之后的下一条指令推送标志寄存器、代码段、用户堆栈和指令指针。系统调用服务完成后,内核会发出
iret
。然后CPU返回到用户模式,应用程序继续正常运行

是否所有库调用都以系统调用结束?

他们中的大多数人都是这样,但也有一些人不是这样。例如,看看
memcpy
和其他内容。

非常感谢!很好的回答:)但是为什么切换到内核模式比仅仅切换一个正常的进程上下文要耗时这么多呢?这两种方法的作用不是很相同:调出寄存器、调用堆栈等?因为需要使用TSS的硬件辅助任务切换。硬件切换不再更新,因此比软件任务切换慢得多。此外,指向TSS的指针位于GDT中,因此需要更多的内存访问。