我可以更改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不受影响."
阅读 Intel 和 AMD 之间的文档并查看代码有时会让人很难理解如何创建没有 IO 端口位图 (IOPB) 的正确任务状态段 (TSS)。使用 IOPB 创建 TSS 似乎也存在混淆,因为 IO 位图 (IOPB) 是否需要尾随字节似乎不明确0xff。
我知道 TSS 和 TSS 描述符(在 GDT 中)之间存在依赖关系。TSS 描述符控制 TSS 的基地址以及限制。描述符中的限制比结构的实际大小小一(本质上类似于 GDT 和 IDT 记录中指定的大小)。TSS 限制用于确定 IOPB 大小。
我知道: