gpt4 book ai didi

assembly - 用户态下哪些指令可以允许执行或禁止执行?

转载 作者:行者123 更新时间:2023-12-01 12:07:07 25 4
gpt4 key购买 nike

有些指令是 CPU 在用户模式下永远无法执行的(例如:HLT 指令)。

还有一些指令 CPU 将始终能够在用户模式下执行(例如:MOV 指令)。

并且在用户态下还有可以允许CPU执行或禁止执行的指令(例如:INOUT指令)。

我的问题是:除了INOUT之外,还有哪些指令可以在用户模式下允许执行或禁止执行?

最佳答案

最初分为三组:

  • 可以在任何权限级别执行的指令

  • 对“IOPL”(IO 特权级别)敏感的指令。这些是IN(和变体 - 字节、字、双字、字符串)、OUT(及其变体)、HLTCLISTI。如果 IOPL(在 eflags 中)设置为 3,则这些指令可以是在用户代码中使用 (CPL=3);如果 IOPL 设置为较低的数值,则这些指令不能在用户代码中使用。

  • supervisor 指令(例如 LGDTWRMSRINVD、...、MOV 到/从调试寄存器)。这些永远不能在 CPL=3 时执行。

从那时起,他们(CPU 制造商 - Intel、AMD、VIA 等)添加了(按“大致时间顺序”):

  • “对齐检查”功能,在 CPL=3 时禁止未对齐的读取和写入

  • RDTSC 指令和一个标志(在 CR4 中)在 CPL=3 时禁止它。

  • 在 CPL=3 时影响 CLISTI 行为的“保护模式虚拟中断”功能(主要用于 virtual8086,但不限于此).

  • MSR 中允许 CPL=0 代码禁用 CPUID leaves > 2 的标志(让 CPU 假装这些叶子不存在),这最初是为旧版本 WindowsNT 中的一个错误错误地解决问题(“软件是软的,硬件是硬的”),但在 20 多年后仍然没有任何合理的原因。

  • 各种虚拟化的东西(例如 VMENTER, VMEXIT, ...)

  • RDTSCP 指令(在 CPL=3 时的访问仍然由 CR4 中较早的标志控制)

  • RDPMC指令

  • SWAPGS 指令

  • SWAPGS 的替代/扩展(RDFSBASERDGSBASEWRFSBASE 等)

  • 名为“UMIP”(用户模式指令预防)的扩展(如果启用)主要防止用户代码使用指令找出内核数据结构的虚拟地址(因此“KASR”稍微少一些一个笑话)。这里不允许的指令是 SGDTSIDTSLDTSMSW字符串

  • MSR 中的一个隐藏/未记录的标志,允许某些内核(如果它们是由能够找到它的开发人员编写的)禁止访问用户代码不应该访问的更多指令能够执行(CPUID,我不知道还有什么)。

关于assembly - 用户态下哪些指令可以允许执行或禁止执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55507736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com