c - 为什么只有内核可以切换CPU执行模式?
问题描述
从我在“理解 Linux 内核第 3 版”一书中读到的内容。只有内核才能将 CPU 执行模式从“用户模式”更改为“内核模式”,反之亦然。
每个 CPU 型号都提供了从用户模式切换到内核模式的特殊指令,反之亦然。程序通常在用户模式下执行,只有在请求内核提供的服务时才切换到内核模式。当内核满足程序的请求时,它会将程序放回用户模式。
内核如何做到这一点?仅在这种情况下,此操作如何可能?如果我得到正确的“配方”(每个 CPU 型号提供的特殊指令),我可以在用户空间中做吗?
解决方案
我相信你已经知道为什么我们有用户模式和内核模式——将可信软件和不可信 软件分开——所以让我们尝试解决方法。(我假设一个 linux 环境,因为您正在阅读有关 linux 内核的信息。)
用户程序不能真正被低级内存和硬件访问信任;充其量,它们可能会覆盖彼此的数据,而在最坏的情况下,它们可能会损坏硬件。但是,当程序只需要访问内存分配或硬件 I/O 等低级功能时,它们可以使用受信任的系统调用列表来执行它们的操作。
根据 LINFO,从用户模式切换到内核模式的标准过程是调用软件中断INT 0x80
- 这假设您使用的是 x86 处理器。具体来说,当处于用户模式的进程尝试访问特权操作时,会引发中断;这是非法的,会产生一个陷阱(异常)。在用户进程触发此中断之前,它会将系统调用号和所述调用的任何参数存储在进程寄存器(处理器中内置的非常小、非常快的内存)中。
一旦用户程序触发中断,内核就会注意到它,检查调用及其参数,然后将模式位(存储在 CS 寄存器中)切换到内核模式。系统调用执行,模式切换回用户,控制权返回用户程序。
该操作只能在这种情况下进行,这在很大程度上是因为它是由硬件强制执行的。我不确定用户是否真的可以在内核空间中执行代码,但是有可能诱使系统认为您是 root 以便访问低级硬件 - 这称为权限提升,而这些漏洞并且漏洞利用很少见,当它们出现时它们是一个巨大的问题。
tl;dr:用户程序尝试访问特权指令,被阻止,并触发请求内核帮助的中断。内核捕获它,将模式位切换到内核模式以执行调用,然后将位切换回并返回给用户。用户不应该能够在内核模式下执行,如果可以的话,你手上就有一个严重的问题。
推荐阅读
- php - CURL 访问被拒绝
- html - 如何将 CSS 文件链接到括号上的 html 页面
- php - Yii2 防止 TimestampBehavior
- c# - 一个“数组”,但对行或列没有限制
- javascript - 减少循环逻辑?
- react-native - 我们如何创建可以使用 .show() 方法显示的 react-native 组件
- c# - Http 动词属性的 Name 属性是什么?
- asp.net - WCF 项目的父文件夹中的连接字符串抛出错误,因为 configSource '..\connectionStrings.config' 无效
- javascript - 在外部点击时反应关闭模式
- json - Flutter snapshot.data.length 返回错误值