【问题标题】:Why only the kernel can switch CPU execution mode?为什么只有内核可以切换CPU执行模式?
【发布时间】:2020-01-06 11:51:42
【问题描述】:

来自我在“理解 Linux 内核第 3 版”一书中所读到的内容。 只有内核才能将 CPU 执行模式从“用户模式”更改为“内核模式”,反之亦然。

每个 CPU 型号都提供了从用户模式切换到内核模式的特殊指令,反之亦然。程序通常在用户模式下执行,只有在请求内核提供的服务时才会切换到内核模式。当内核满足程序的请求时,它会将程序重新置于用户模式。

内核如何做到这一点?仅在这种情况下,此操作如何可能? 如果我得到正确的“配方”(每个 CPU 型号提供的特殊指令),我可以在用户空间中做吗?

【问题讨论】:

    标签: c kernel


    【解决方案1】:

    我相信您已经知道为什么我们有用户和内核模式 - separation 或 trusted and untrusted software - 所以让我们尝试解决方法。(我假设是 linux 环境,因为您正在阅读有关 linux 内核的信息。)

    用户程序不能真正被低级内存和硬件访问信任;充其量,它们可以覆盖彼此的数据,而在最坏的情况下,它们可能会损坏硬件。但是,当程序只需要访问内存分配或硬件 I/O 等低级功能时,它们可以使用 trusted system calls 的列表来执行它们的操作。

    根据 LINFO,从用户模式切换到内核模式的标准过程是调用software interrupt INT 0x80 - 这假设你是on an x86 processor. 具体来说,当处于用户模式attempts to access a privileged operation 的进程时抛出中断;这是非法的,会产生一个陷阱(异常)。在用户进程触发此中断之前,它会将system call number 和所述调用的任何参数存储在进程寄存器(处理器中内置的非常小、非常快的内存)中。

    一旦用户的程序触发中断,内核就会注意到它,检查调用及其参数,然后switches the mode bit(存储在 CS 寄存器中)进入内核模式。系统调用执行,模式切换回用户,控制权返回用户程序。


    该操作只能在这种情况下进行,很大程度上是因为它是 enforced by the hardware. 我不确定 用户 是否真的可以在内核空间中执行代码,但这是可能的诱骗系统认为您是 root 以访问低级硬件 - 这称为 privilege escalation,虽然此类漏洞和漏洞利用很少见,但当它们出现时它们是一个巨大问题向上。


    tl;dr: 用户程序尝试访问特权指令,被阻塞,并触发请求内核帮助的中断。内核捕获它,将模式位切换到内核模式以执行调用,然后将位切换回并返回给用户。用户不应该能够在内核模式下执行,如果他们可以,那么你手上就有一个严重的问题。

    【讨论】:

      【解决方案2】:

      这并不完全正确。 CPU 将切换执行模式,用户空间程序可以强制这种切换。只是该内核应确保所有方法都将进入内核控制的内存。

      系统调用是进入内核模式的最常用方法之一。有多种方法可以进行系统调用,例如带有软件中断,或者只是一个远调用(远调用:使用自定义段,在段表上特别标记)。

      但用户空间程序可以使 CPU 切换到内核,但有异常(例如,除以零,因此使用显式指令)、保护异常(访问受保护的内存)、调试寄存器等。

      而硬件中断(定时器,还有新的输入)可以使 CPU 切换到内核模式(在这种情况下是特殊的中断模式,堆栈很小,但如果有很多事情要做,中断代码会在中断完成后进入内核模式)。

      注意:实模式下的任何代码都可以切换到保护模式,但这仅与启动阶段有关。

      【讨论】:

        【解决方案3】:

        用户进程可以指示处理器切换到内核模式,但是(在没有错误的情况下)这只有可能以一种设计用于控制内核软件。切换到内核模式的指令保存有关用户进程的信息,然后将程序执行更改为内核软件。所以当切换到内核模式时,运行的软件是内核的,而不是你的进程的。当操作系统第一次开始在处理器上运行时,它会配置处理器以支持此操作。

        此功能用于用户进程向内核请求服务。如果用户进程想要将数据写入磁盘或打开网络连接或执行其他任何特权操作,它会格式化请求(以某种方式取决于操作系统和硬件),然后执行指令以切换到内核模式.这会导致内核软件运行,它会检查请求并对其进行处理。

        内核完成后,它会执行另一条特殊指令,恢复在用户模式下运行进程。

        通常,您的进程不可能请求它在内核模式下运行,而不是通过任何指令序列。如果您的进程具有特权,它可能能够对内核执行各种请求,使其能够在内核模式下运行软件。 (最简单地说,在某些系统上,特权进程可以加载内核扩展,然后将其用于特权操作。)

        【讨论】:

        • 所以这意味着用户空间代码永远不能在 CPU 内核模式下运行?但它可以加载内核扩展来完成内核中的特权工作?
        • @sergeyrar:“从不”是绝对的。特权进程可以加载和执行内核扩展,内核扩展可以做任何事情,包括更改操作系统以让进程在内核模式下运行自己的代码。但是,通常情况下,用户进程不能在内核模式下运行。
        猜你喜欢
        • 2010-10-23
        • 1970-01-01
        • 2017-03-05
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-01
        相关资源
        最近更新 更多