首页 > 解决方案 > 为什么只有内核可以切换CPU执行模式?

问题描述

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

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

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

标签: ckernel

解决方案


我相信你已经知道为什么我们有用户模式和内核模式——可信软件和不可信 软件分开——所以让我们尝试解决方法。(我假设一个 linux 环境,因为您正在阅读有关 linux 内核的信息。)

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

根据 LINFO,从用户模式切换到内核模式的标准过程是调用软件中断INT 0x80- 这假设您使用的是 x86 处理器。具体来说,当处于用户模式的进程尝试访问特权操作时,会引发中断;这是非法的,会产生一个陷阱(异常)。在用户进程触发此中断之前,它会将系统调用号和所述调用的任何参数存储在进程寄存器(处理器中内置的非常小、非常快的内存)中。

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


该操作只能在这种情况下进行,这在很大程度上是因为它是由硬件强制执行的。我不确定用户是否真的可以在内核空间中执行代码,但是有可能诱使系统认为您是 root 以便访问低级硬件 - 这称为权限提升,而这些漏洞并且漏洞利用很少见,当它们出现时它们是一个巨大的问题。


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


推荐阅读