【问题标题】:System call without context switching?没有上下文切换的系统调用?
【发布时间】:2012-02-11 07:24:09
【问题描述】:

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

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

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

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

“this stack”是内核存储进程寄存器等的地方。

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

【问题讨论】:

    标签: process linux-kernel context-switch


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      “上下文切换”可能意味着以下两件事之一,两者都相关:(1)从用户模式切换到内核模式以处理系统调用,或不自觉地切换到内核模式以处理针对中断堆栈的中断,或者 (2) 切换到在用户空间运行另​​一个用户进程,并在两者之间跳转到内核空间。

      从用户空间到内核空间的任何移动都意味着节省足够的用户空间以可靠地返回到它。如果内核空间代码决定 - 当您不再为该进程运行用户代码时 - 是时候让另一个用户进程运行了,它就会进入。

      因此,至少,您说的是 2-3 个堆栈或存储“上下文”的位置:硬件中断需要内核级堆栈来说明要返回的内容;用户方法/子程序调用使用标准堆栈来完成。等等。

      最初的 Unix 内核——现在这部分的模型没有太大的不同——运行系统调用就像一个短时间厨师处理早餐订单:把它移到炉子上,为培根的订单腾出空间刚到,开始培根,回到第一个订单。全部在内核切换上下文中。不是一个庞大的监控应用程序,它可能让 IBM 和 DEC 软件人员发疯。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 谢谢。研究这个已经很久了,但我的印象是硬件中断实际上中断执行并立即跳转到处理过程,而不是稍后轮询中断。我想如果进程在内核模式下执行,它仍然需要在跳转之前存储它的上下文,但也许这是我的错误?我想现在如果被调用的方法正确处理使用的寄存器,这与任何其他方法调用没有什么不同。我做对了吗?
        • 我的理解是进程运行在用户态,在处理中断之前确实有上下文切换到内核态。然而,在单片内核中处理中断不需要额外的上下文切换,但在微内核中需要(因为设备驱动程序驻留在用户空间中)。
        • 我很好奇为什么驻留在用户空间的设备驱动程序不处于kerenl模式?
        猜你喜欢
        • 2020-11-01
        • 1970-01-01
        • 2021-11-18
        • 2016-11-06
        • 2023-03-03
        • 2021-12-22
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多