相关疑难解决方法(0)

x86_64:我可以更改EFLAGS寄存器中的VM标志吗?

我可以更改EFLAGS寄存器中的VM标志吗?如果是这样,怎么样?

请注意,我不能只使用pushf,操纵堆栈上的值,然后popf.根据英特尔手册:

第2卷,第4.3章PUSHF:

"将整个EFLAGS寄存器复制到堆栈时,不会复制VM和RF标志(位16和17);而是在存储在堆栈中的EFLAGS映像中清除这些标志的值."

第2卷,第4.3章POPF:

"在特权级别0(或实地址模式,相当于特权级别0)的受保护,兼容性或64位模式下运行时,EFLAGS寄存器中的所有非保留标志(RF1,VIP,VIF除外) ,VM可能会被修改.VIP,VIF和VM不受影响."

assembly x86-64 virtual-machine

4
推荐指数
1
解决办法
572
查看次数

使用或不使用 IO 位图创建正确的任务状态段 (TSS) 结构?

阅读 Intel 和 AMD 之间的文档并查看代码有时会让人很难理解如何创建没有 IO 端口位图 (IOPB) 的正确任务状态段 (TSS)。使用 IOPB 创建 TSS 似乎也存在混淆,因为 IO 位图 (IOPB) 是否需要尾随字节似乎不明确0xff

我知道 TSS 和 TSS 描述符(在 GDT 中)之间存在依赖关系。TSS 描述符控制 TSS 的基地址以及限制。描述符中的限制比结构的实际大小小一(本质上类似于 GDT 和 IDT 记录中指定的大小)。TSS 限制用于确定 IOPB 大小。

我知道:

  • TSS描述符限制比整个TSS结构的大小小1
  • 16位TSS没有IOPB并且结构是固定大小的
  • 基本的32位和64位TSS结构大小相似(数据含义不同)
  • 32 位 TSS 可以通过向基本结构添加额外的 DWORD 来支持控制流强制。
  • TSS 中的 IOPB 偏移量(字)指向相对于任务段开头的偏移量。
  • IOPB 偏移量指向 IOPB 结构的开头,并且在启用虚拟模式增强 (VME)的情况下,IOPB 之前的 32 个字节是中断重定向表。
  • 如果未启用 VME,内核可以在基本 TSS 结构的末尾和 IOPB 偏移之间放置额外的每个任务实例数据
  • 如果启用了 VME,内核可以在基本 TSS 结构的末尾和 IOPB 以下 32 字节的偏移量之间放置额外的每个任务实例数据。
  • 如果存在 IOPB,则每个 0 位表示端口访问权限,1 位表示拒绝权限。 …

x86 x86-64 intel osdev amd-processor

3
推荐指数
1
解决办法
2284
查看次数

标签 统计

x86-64 ×2

amd-processor ×1

assembly ×1

intel ×1

osdev ×1

virtual-machine ×1

x86 ×1