6

当我遇到这个时,我正在阅读 linux 在我的操作系统手册中的工作原理。

[...] 内核被创建为一个单一的、单一的二进制文件。主要原因是为了提高性能。因为所有内核代码和数据结构都保存在单个地址空间中,所以当进程调用操作系统函数或传递硬件中断时,不需要上下文切换。

这对我来说听起来很神奇,它肯定必须在运行到内核模式来处理中断之前存储进程的上下文。但是好的,我现在就买它。在几页上,在描述进程的调度上下文时,它说:

进程执行时发生的系统调用和中断都将使用此堆栈。

“这个堆栈”是内核存储进程寄存器等的地方。

这不是与第一句话直接矛盾吗?我是否以某种方式误解了它?

4

3 回答 3

6

我认为第一句话是指单片内核和微内核之间的区别

Linux 是单片的,它的所有内核组件(设备驱动程序、调度程序、VM 管理器)都在ring 0运行。因此,在执行系统调用和处理中断时不需要上下文切换。

对比微内核,其中设备驱动程序和 IPC 提供程序等组件在环 0 之外的用户空间运行。因此,此架构在执行系统调用(因为执行模块可能驻留在用户空间)和处理中断(中继设备驱动程序的中断)。

于 2012-01-16T10:40:50.827 回答
4

"Context switch" could mean one of a couple of things, both relevant: (1) switching from user to kernel mode to process the system call, or an involuntary switch to kernel mode to process an interrupt against the interrupt stack, or (2) switching to run another user process in user space, with a jump to kernel space in between the two.

Any movement from user space to kernel space implies saving enough user-space to return to it reliably. If the kernel-space code decides that - while you're no longer running the user-code for that process - it's time to let another user-process run, it gets in.

So at the least, you're talking 2-3 stacks or places to store a "context": hardware-interrupts need a kernel-level stack to say what to return to; user method/subroutine calls use a standard stack for getting that done. Etc.

The original Unix kernels - and the model isn't that different now for this part - ran the system calls like a short-order cook processing breakfast orders: move this over on the stove to make room for the order of bacon that just arrived, start the bacon, go back to the first order. All in kernel switching context. Was not a huge monitoring application, which probably drove the IBM and DEC software folks mad.

于 2012-11-13T16:45:57.660 回答
1

在 Linux 中进行系统调用时,会从用户空间到内核空间(ring3 到 ring0)进行上下文切换。每个进程都有一个关联的内核模式堆栈,供系统调用使用。在执行系统调用之前,进程的 CPU 寄存器存储在其用户态堆栈中,该堆栈不同于内核态堆栈,是进程用于用户空间执行的堆栈。

当进程处于内核模式(或用户模式)时,调用相同模式的函数将不需要上下文切换。这就是第一个引用所指的内容。

第二个引用是指内核模式堆栈,而不是用户模式堆栈。

说到这里,我必须提到 Linux 优化,其中不需要转换到内核空间来执行系统调用,即与系统调用相关的所有处理都在用户空间本身中完成(因此no context switch)。vsyscall,并且VDSO是这样的技术。他们背后的想法很简单。它是将执行相应系统调用所需的数据发送到用户空间。更多信息可以在这篇 LWN 文章中找到。

除此之外,还有一些研究项目,其中所有的执行都发生在同一个环中。用户空间程序和操作系统代码都驻留在same ring. 想法是摆脱环形交换机的开销。微软的 [singularity][2] OS就是这样一个项目。

于 2016-07-09T15:19:16.483 回答