【求助】请教一下VT退出恢复 IDT GDT的问题
发送 exitvmexithandle处理
调用vm_off前
恢复恢复 IDT GDT
_lgdt(&gdtr);
__lidt(&idtr);
为什么会运行出错的 虚拟机测试直接重启
测试环境 win77601
屏蔽这两行代码就没事了可以顺利退出
不清楚你怎么定义你的GDTR和IDTR结构体的,总之它是紧密排列的,换言之就是你要确保Limit和Base中间没有因为对齐之类的原因造成的空隙。LGDT和LIDT只会读4或6或10个字节(64位就是10个字节)。另外__vmx_vmread这个东西是会覆盖整个SIZE_T长度,并不会因为你读的是小字段就不覆盖后面的东西。
重启了是因为三重故障:第一次异常发到IDT里没法用,GDT也没法选择段,就会转化成双重故障异常,再次发进IDT里,还是接不住,就转成三重故障,直接重启。 tangptr@126.com 发表于 2023-10-18 20:11
不清楚你怎么定义你的GDTR和IDTR结构体的,总之它是紧密排列的,换言之就是你要确保Limit和Base中间没有因 ...
typedef struct _Idtr {
unsigned short limit;
UINT64 base;
}Idtr;
感谢大神指点
实在不知道怎么定义了
看了堆栈确实没对齐,
用汇编操作了强行移位构造出需要的数据结构
目前就这么解决了
请教一下纯代码应该怎么写那个结构 有一种偷懒的办法是
typedef struct _IDTR64
{
USHORT Pad;
USHORT Limit;
ULONG64 Base;
}IDTR64;
这样Limit和Base就没有空隙了,然后把&idtr.Limit喂给lidt指令。
你也可以用pragma pack语法勒令结构体的对齐粒度。
页:
[1]