- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先考虑只有一个操作系统时的情况。现在我运行一些可执行文件。处理器从可执行文件中读取指令并执行这些指令。尽管我可以在文件中放入任何我想要的指令,但我的程序无法读取 HDD 的任意区域(并且做许多其他潜在的“坏”事情)。
它看起来像魔法,但我明白这个魔法是如何运作的。操作系统启动我的程序并将处理器置于某种“非特权”状态。在此状态下不允许使用“不安全”处理器指令,将处理器返回“特权”状态的唯一方法是将控制权交还给内核。内核代码可以使用处理器的所有指令,因此如果它决定允许,它可以执行我的程序“要求”的潜在不安全的事情。
现在假设我们在 Windows 主机上有 VMWare 或 VirtualBox。 guest 操作系统是 Linux。我在 guest 中运行一个程序,它将控制转移到 guest Linux 内核。 guest Linux 内核的代码应该在处理器的“特权”模式下运行(它必须包含“不安全”的处理器指令!)。但我强烈怀疑它是否可以无限制地访问所有计算机资源。
我不需要太多的技术细节,我只想了解这部分魔术是如何工作的。
最佳答案
这是一个很好的问题,它确实触及了一些关于安全和虚拟化的很酷的细节。我将简要概述英特尔处理器的工作原理。
操作系统如何管理正常进程?
英特尔处理器有 4 个不同的“保护环”,它可以随时处于其中。当前运行代码的环决定了可能运行的特定汇编指令。 Ring 0 可以运行所有特权指令,而 Ring 3 不能运行任何特权指令。
操作系统内核始终运行在 ring 0 中。这个环允许内核执行它需要的特权指令,以便控制内存、启动程序、写入 HDD 等。
用户应用程序在环 3 中运行。此环不允许特权指令(例如,写入 HDD 的指令)运行。如果应用程序试图运行特权指令,处理器将从进程中获取控制权并引发内核将在 ring 0 中处理的异常;内核可能会终止进程。
虽然第 1 环和第 2 环有用,但它们往往不被使用。
虚拟化是如何工作的?
在虚拟化有硬件支持之前,虚拟机监视器(如 VMWare)需要做一些称为二进制翻译的事情(参见 paper)。在高级别,这包括 VMM 检查 guest 操作系统的二进制文件并以安全的方式模拟特权指令的行为。
现在英特尔处理器中有对虚拟化的硬件支持(查找英特尔 VT-x)。除了上面提到的四环外,处理器还有两种状态,每一种状态又包含四环:VMX root模式和VMX非root模式。
主机操作系统及其应用程序以及 VMM(例如 VMWare)以 VMX root 模式运行。 guest 操作系统及其应用程序以 VMX 非根模式运行。同样,这两种模式都有自己的四个环,因此主机操作系统在根模式的环 0 中运行,主机操作系统应用程序在根模式的环 3 中运行, guest 操作系统在非根模式的环 0 中运行, guest 操作系统应用程序在非根模式的环 3 中运行。
当在非根模式的 ring 0 中运行的代码试图执行特权指令时,处理器会将控制权交还给在根模式下运行的主机操作系统,以便主机操作系统可以模拟效果并防止 guest 无法直接访问特权资源(或者在某些情况下,处理器硬件可以在不让主机参与的情况下自行模拟效果)。因此, guest 操作系统可以“执行”特权指令,而无需对硬件资源进行不安全访问——指令只是被拦截和模拟。 guest 不能随心所欲 - 只能做主机和硬件允许的事情。
需要澄清的是,在非根模式的第 3 环运行的代码如果试图执行特权指令,将导致向客户操作系统发送异常,就像如果代码执行时向主机操作系统发送异常一样在 root 模式的 ring 3 中运行,尝试执行特权指令。
关于operating-system - 类似 VirtualBox 的虚拟化是如何工作的? (需要一些技术细节),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51538789/
我正在尝试用 C 语言编写一个使用 gstreamer 的 GTK+ 应用程序。 GTK+ 需要 gtk_main() 来执行。 gstreamer 需要 g_main_loop_run() 来执行。
我已经使用 apt-get 安装了 opencv。我得到了以下版本的opencv2,它工作正常: rover@rover_pi:/usr/lib/arm-linux-gnueabihf $ pytho
我有一个看起来像这样的 View 层次结构(基于其他答案和 Apple 的使用 UIScrollView 的高级 AutoLayout 指南): ScrollView 所需的2 个步骤是: 为 Scr
我尝试安装 udev。 udev 在 ./configure 期间给我一个错误 --exists: command not found configure: error: pkg-config and
我正在使用 SQLite 3。我有一个表,forums,有 150 行,还有一个表,posts,有大约 440 万行。每个帖子都属于一个论坛。 我想从每个论坛中选择最新帖子的时间戳。如果我使用 SEL
使用 go 和以下包: github.com/julienschmidt/httprouter github.com/shwoodard/jsonapi gopkg.in/mgo.v2/bson
The database仅包含 2 个表: 钱包(100 万行) 事务(1500 万行) CockroachDB 19.2.6 在 3 台 Ubuntu 机器上运行 每个 2vCPU 每个 8GB R
我很难理解为什么在下面的代码中直接调用 std::swap() 会导致编译错误,而使用 std::iter_swap 编译却没有任何错误. 来自 iter_swap() versus swap() -
我有一个非常简单的 SELECT *用 WHERE NOT EXISTS 查询条款。 SELECT * FROM "BMAN_TP3"."TT_SPLDR_55E63A28_59358" SELECT
我试图按部分组织我的 .css 文件,我需要从任何文件访问文件组中的任何类。在 Less 中,我可以毫无问题地创建一个包含所有文件导入的主文件,并且每个文件都导入主文件,但在 Sass 中,我收到一个
Microsoft.AspNet.SignalR.Redis 和 StackExchange.Redis.Extensions.Core 在同一个项目中使用。前者需要StackExchange.Red
这个问题在这里已经有了答案: Updating from Rails 4.0 to 4.1 gives sass-rails railties version conflicts (4 个答案) 关
我们有一些使用 Azure DevOps 发布管道部署到的现场服务器。我们已经使用这些发布管道几个月了,没有出现任何问题。今天,我们在下载该项目的工件时开始出现身份验证错误。 部署组中的节点显示在线,
Tip: instead of creating indexes here, run queries in your code – if you're missing any indexes, you
你能解释一下 Elm 下一个声明中的意思吗? (=>) = (,) 我在 Elm architecture tutorial 的例子中找到了它 最佳答案 这是中缀符号。实际上,这定义了一个函数 (=>
我需要一个 .NET 程序集查看器,它可以显示低级详细信息,例如元数据表内容等。 最佳答案 ildasm 是 IL 反汇编程序,具有低级托管元数据 token 信息。安装 Visual Studio
我有两个列表要在 Excel 中进行比较。这是一个很长的列表,我需要一个 excel 函数或 vba 代码来执行此操作。我已经没有想法了,因此转向你: **Old List** A
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
我正在学习 xml 和 xml 处理。我无法很好地理解命名空间的存在。 我了解到命名空间帮助我们在 xml 中分离相同命名的元素。我们不能通过具有相同名称的属性来区分元素吗?为什么命名空间很重要或需要
我搜索了 Azure 文档、各种社区论坛和 google,但没有找到关于需要在公司防火墙上打开哪些端口以允许 Azure 所有组件(blob、sql、compute、bus、publish)的简洁声明
我是一名优秀的程序员,十分优秀!