|
发表于 2020-11-18 14:10:23
|
显示全部楼层
crx read shadow是要和crx guest/host mask组合用的,后者置位的位归host控制,复位的位归guest控制。当crx guest/host mask的某一位置位时,guest对crx的该位写入不同于read shadow对应位的值就会引起VM-Exit,读取该位时就会返回对应位的值。
通常来讲,如果写VT仅仅是搞个轻量虚拟化玩玩,那倒不必管cr0,管一下cr4的vmxe位即可。cr0 guest/host mask和cr0 read shadow都设置为零,于是guest读cr0时直接是guest cr0的值。至于cr4,可以将cr4 guest/host mask设置为0x2000,而read shadow设置为零,于是乎读取的时候就会返回CR4.VMXE=0了。
再举例说明一下吧。假设vmcs中guest cr0=0x80000021,cr0 guest/host mask=0x10000000,cr0 read shadow=0xffffffff。
那么第28位被host控制,其余位均被guest控制。
当guest读取cr0时,返回的第28位从cr0 read shadow里取,其余位从guest cr0里取,也就是说,返回的是0x90000021。
当guest写入cr0时,如果写入的值的第28位是复位,则产生VM-Exit,比如写入0x80000021会产生VM-Exit,而写入0x90000021不会。
具体看intel手册呗
至于楼上说“readcr0得到的就是字段里的值”,这是cr0 guest/host mask全部置位时的情况,或者说cr0 guest/host mask刚好等于guest cr0。
你蓝屏什么情况不清楚,仔细检查一遍vmcs并且观察调试器吧。 |
评分
-
查看全部评分
|