- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有些指令是 CPU 在用户模式下永远无法执行的(例如:HLT
指令)。
还有一些指令 CPU 将始终能够在用户模式下执行(例如:MOV
指令)。
并且在用户态下还有可以允许CPU执行或禁止执行的指令(例如:IN
和OUT
指令)。
我的问题是:除了IN
和OUT
之外,还有哪些指令可以在用户模式下允许执行或禁止执行?
最佳答案
最初分为三组:
可以在任何权限级别执行的指令
对“IOPL”(IO 特权级别)敏感的指令。这些是IN
(和变体 - 字节、字、双字、字符串)、OUT
(及其变体)、HLT
、CLI
和 STI
。如果 IOPL(在 eflags 中)设置为 3,则这些指令可以是在用户代码中使用 (CPL=3);如果 IOPL 设置为较低的数值,则这些指令不能在用户代码中使用。
supervisor 指令(例如 LGDT
、WRMSR
、INVD
、...、MOV 到/从调试寄存器
)。这些永远不能在 CPL=3 时执行。
从那时起,他们(CPU 制造商 - Intel、AMD、VIA 等)添加了(按“大致时间顺序”):
“对齐检查”功能,在 CPL=3 时禁止未对齐的读取和写入
RDTSC 指令和一个标志(在 CR4 中)在 CPL=3 时禁止它。
在 CPL=3 时影响 CLI
和 STI
行为的“保护模式虚拟中断”功能(主要用于 virtual8086,但不限于此).
MSR 中允许 CPL=0 代码禁用 CPUID leaves > 2
的标志(让 CPU 假装这些叶子不存在),这最初是为旧版本 WindowsNT 中的一个错误错误地解决问题(“软件是软的,硬件是硬的”),但在 20 多年后仍然没有任何合理的原因。
各种虚拟化的东西(例如 VMENTER
, VMEXIT
, ...)
RDTSCP 指令(在 CPL=3 时的访问仍然由 CR4 中较早的标志控制)
RDPMC
指令
SWAPGS
指令
SWAPGS
的替代/扩展(RDFSBASE
、RDGSBASE
、WRFSBASE
等)
名为“UMIP”(用户模式指令预防)的扩展(如果启用)主要防止用户代码使用指令找出内核数据结构的虚拟地址(因此“KASR”稍微少一些一个笑话)。这里不允许的指令是 SGDT
、SIDT
、SLDT
、SMSW
和 字符串
。
MSR 中的一个隐藏/未记录的标志,允许某些内核(如果它们是由能够找到它的开发人员编写的)禁止访问用户代码不应该访问的更多指令能够执行(CPUID
,我不知道还有什么)。
关于assembly - 用户态下哪些指令可以允许执行或禁止执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55507736/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!