加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 服务器 > 系统 > 正文

assembly – 为什么这个mov gs指令会导致运行Windows 7操作系统

发布时间:2021-02-24 04:16:54 所属栏目:系统 来源:网络整理
导读:当我在VMWare Workstation虚拟机中运行的 Windows 7 x64的内核模式下运行以下汇编序列时: xor eax,eaxmov ax,gsmov gs,ax ; this instruction 最后一个mov gs,ax指令会立即导致该VM崩溃(或可能是错误检查),并显示以下弹出消息: A fault has occurred causi

当我在VMWare Workstation虚拟机中运行的 Windows 7 x64的内核模式下运行以下汇编序列时:

xor eax,eax
mov ax,gs
mov gs,ax     ; this instruction

enter image description here

最后一个mov gs,ax指令会立即导致该VM崩溃(或可能是错误检查),并显示以下弹出消息:

enter image description here

A fault has occurred causing a virtual CPU to enter the shutdown
state. If this fault had occurred outside of a virtual machine,it
would have caused the physical machine to restart. The shutdown state
can be reached by incorrectly configuring the virtual machine,a bug
in the guest operating system,or a problem in VMWare Workstation.

重新加载gs注册会导致内核中的问题,还是虚拟化问题?

我没有看到英特尔手册中有关mov指令的任何异常.

PS.顺便说一句,用fs替换gs寄存器不会导致此错误.

编辑:回答有关GDT中段描述符状态的问题.这里是:

0: kd> r gs
gs=002b
0: kd> dg 28
                                                    P Si Gr Pr Lo
Sel        Base              Limit          Type    l ze an es ng Flags
---- ----------------- ----------------- ---------- - -- -- -- -- --------
0028 00000000`00000000 00000000`ffffffff Data RW Ac 3 Bg Pg P  Nl 00000cf3

解决方法

我不确定为什么移动移动gs,ax会导致Windows立即三重故障,但很快就会导致它崩溃.在64位Windows内核中,GS段用作访问当前CPU Processor Control Region(PCR)的指针.每个CPU具有指向不同PCR的不同GS基值.你的mov ax,gs mov gs,ax序列实际上会破坏它,因为它将GS base的不正确值加载到描述符缓存中.

GDT实际上并不包含GS寄存器的正确基础.由于GDT只能保存32位地址,因此实际上并不用于加载GS基址.相反,IA32_GS_BASE和IA32_KERNEL_GS_BASE MSR(后者与SWAPGS指令组合)用于为GS段设置64位基址.存储在GS寄存器中的选择器值只是一个虚拟值.

所以你的mov gs,ax指令加载存储在GDT中的虚拟32位基值,而不是存储在IA32_GS_BASE中的64位值.这意味着GS段的基地址设置为0,而不是当前CPU的PCR地址.在加载这个不正确的GS库之后,Windows内核尝试使用GS寄存器访问PCR(使用诸如mov rax,gs:[10]之类的指令)并且最终读取可能未映射的内存导致只是时间问题.意外的内核页面错误和崩溃.

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读