为什么x86分页没有特权环的概念?

2024-05-06

早在 1982 年,当 Intel 发布 80286 时,他们在分段方案中添加了 4 个特权级别(环 0-3),由全局描述符表 (GDT) 和局部描述符表 (LDT) 中的 2 位指定。

在 80386 处理器中,Intel 添加了分页功能,但令人惊讶的是,它只有 2 个权限级别(管理员和用户),由页目录项 (PDE) 和页表项 (PTE) 中的单个位指定。

这意味着仅使用分页的操作系统(如大多数现代操作系统)无法从环 1 和环 2 的存在中受益,而环 1 和环 2 可能非常有用,例如对于驱动程序。 (例如,Win9x 经常崩溃,因为它将有缺陷的未经检查的驱动程序加载到环 0 中)。

从可移植性的角度来看,环 1 和环 2 的存在是 x86 架构的一个怪癖,便携式操作系统不应该使用它们,因为其他架构只有 2 个特权级别。

但我确信英特尔工程师在 1985 年设计 386 时并没有考虑到其他平台的可移植性。

那么为什么 Intel 不允许分页有 4 个特权级别,比如分段呢?


我想到的一个猜测是,英特尔打算在 Ring 1 代码运行时,is主管,“主管”环3代码。环 1 未运行under ring 0.

如果环 1 代码想要调用环 0 代码,它可以通过调用门进行调用,环 0 代码可以将 CR3 更改为页表,其中包含环页表中不存在的物理页的映射使用了 1 或 2 个代码。

我真的对这个东西了解不多,但是https://wiki.osdev.org/Task_State_Segment https://wiki.osdev.org/Task_State_Segment显示 TSS 包含 CR3 字段,因此使用硬件任务切换我猜测通过调用门进行调用可以直接触发 CR3 更改。 (所以调用目标not已经必须被映射,否则环 1 / 2 代码可能会修改它。或者它可以与页表本身和 GDT 一起映射为只读,以通过修改它来阻止环 1 代码接管环 0。)

这意味着操作系统仅使用分页[...] 无法从环 1 和环 2 的存在中受益

这是你的错误:你不能“仅使用分页”。即使在普通 x86 操作系统(具有平面内存模型)上从用户空间进行中断处理也需要设置 TSS 内容,以在切换到内核模式时将 ESP 设置为内核堆栈指针,即使您不使用硬件任务-交换。

x86 有“任务门”和“调用门”以及各种非常复杂的东西,我希望我不必完全理解,但我希望花一些时间阅读它可能会对这些事情有所了解386 的架构师认为操作系统可能想做。

Separate from my previous guess (about ring 1 supervising ring 3), perhaps Intel expected OSes to use segmentation to separate ring 1 / 2 from ring 0 memory in the same page table if desired1. As you say, they probably weren't trying to create something that portable microkernel OSes could just use as a bonus.

内核可以自行决定虚拟地址空间的布局,因此它可以很好地分配其中的块供环 1 代码使用,在调用它时适当地设置 CS/DS/ES/SS。

不过,我认为这意味着非平面模型,因为 x86 分段使地址从 0.. 限制开始 https://wiki.osdev.org/Segment_Limits,不是例如允许访问从低到高的一系列虚拟地址,而不改变指针的含义。

脚注1:

在ring 0和ring 1之间是否需要有完整的内存保护?操作系统可能将环 1 用于半可信代码。

一些特权指令需要环 0,因此环 1 可以阻止意外发生。 IO权限级别可以单独设置,以允许cli and in/out在环 > 0 中,但其他指令如invlpg https://www.felixcloutier.com/x86/invlpg, lgdt https://www.felixcloutier.com/x86/lgdt:lidt, and mov cr, reg https://www.felixcloutier.com/x86/mov-1需要实际的环 0。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么x86分页没有特权环的概念? 的相关文章

  • Linux内核页表更新

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 为什么在谈论线程和进程时,“不要同时格式化软盘”的评论很有趣?

    我正在阅读之间的区别线程和进程 https stackoverflow com questions 200469 what is the difference between a process and a thread并在第二个答案中发现
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 如何使用 os.chdir 转到减去最后一步的路径?

    例如 一个方法传递了一个路径作为参数 这个路径可能是 C a b c d 如果我想使用 os chdir 更改为 C a b 怎么办 c 没有最后一个文件夹 os chdir 可以接受 命令吗 os chdir 可以采取 作为论点 是的 然
  • 如何检索 iPhone 的区域设置

    我用谷歌搜索过它 但令我有点惊讶的是我找不到它 我只想访问设备配置的区域设置 我试图找到如何列出所有系统属性 以防我能在那里找到区域设置 但甚至找不到如何做到这一点 我知道 认为 我之前检索过系统属性 但我也记得在谷歌搜索时找到该信息并不容
  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • 将字段中的位扩展到掩码中所有(重叠+相邻)集位的最快方法?

    假设我有 2 个名为 IN 和 MASK 的二进制输入 实际字段大小可能是 32 到 256 位 具体取决于用于完成任务的指令集 每次调用时两个输入都会改变 Inputs IN 1100010010010100 MASK 000111101
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v
  • 限制分页页数

    objConnect mysql connect localhost root or die mysql error objDB mysql select db Test strSQL SELECT FROM UserAddedRecord
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • 标志寄存器中保留/未定义位的用途是什么?

    在 Z80 8080 8085 和 8086 处理器的标志寄存器中 被记录为 保留 或 未定义 的位 1 3 5 的用途是什么 这些位未使用 也就是说 没有指令明确地将它们设置为任何值 设计人员认为 5 6 个标志就足够了 他们只是将标志寄
  • 授予用户 ALTER 函数的权限

    我试着ALTER一个新用户的函数 我收到错误 ERROR must be owner of function ACases Error ERROR must be owner of function ACases SQL state 425
  • 在上下文切换期间,操作系统是否使用 PCB 或内核堆栈来恢复寄存器?

    我目前正在阅读 Remzi 和 Andrea 所著的 操作系统 三个简单的部分 在有关上下文切换的部分中 它指出在中断期间 正在运行的进程的寄存器被保存到其内核堆栈中 然后将运行进程的寄存器保存到内核堆栈中 下一个进程是从 PCB 加载的
  • 以受限用户身份运行 monit 并使其监视需要 root 权限的进程

    我有一个用 Ruby 编写的特定脚本 需要 root 权限 大多数其他进程不需要它 因此很容易在 Monit 中设置 不是这个 服务器需要监听386 这个端口只有root可用 我不会详细说明原因 因为 1 我不是一个低级的人 2 到目前为止
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • 对将英特尔傲腾 DC SSD 用作 IMDT 的额外 RAM 感到困惑吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对英特尔傲腾 DC 有点困惑 我希望我的 Optane DC 能够同时充当 DRAM 和存储 一方面 我了解到只有 英特尔傲腾 DC 持
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840

随机推荐