zhouhe VT(八) PAE模式下开启EPT

前言:
代码在非PAE模式下运行正常,在PAE模式下会报三重错误

一、分析原因

Intel手册Table24-4下写了PDPTE的四个寄存器
 
0
PAE模式下使用的是2-9-9-12分页模式
 
0
PDPTE只有四项,为了提升效率,Intel直接把这四项设为了四个高速寄存器 PDTPE Registers
参见4.4
 
0
 
所以,在PAE模式下寻址的时候,虚拟机直接找那四个高速缓存寄存器
我们之前没有设置过这四个寄存器,虚拟机找不到PTPDE的地址,无法寻址,故产生三重错误
 

二、设置四个高速缓存寄存器

0
在winxp下PDPTE的第零项固定在0xc0600000的位置,第一项固定在0xc0600000 + 0x1000的位置,以此类推...
我们直接进行填充
如下图
 
0

三、处理蓝屏问题1

我们运行的时候会出现蓝屏问题
Host在接管cr3的读取的时候,没有更新PDPTE寄存器的物理地址,这样仍会导致内存读写异常
我们需要在 Host接管cr3后更新PDPTE寄存器的物理地址
 

四、处理蓝屏问题2

Host在接管Cr3读写后,Cr3已经切换了,而我们仍在用以前的Cr3更新PDPTE寄存器的物理地址,这样仍然会导致内存读写异常。。。
我们需要用更改后的Guest的CR3进行更新PDPTE的物理地址
 
0
 

五、运行

处理完上面两个问题后,我们的代码就可以在PAE状态下运行了
 
0
至此代码基本完工
 
该节的代码链接:

__EOF__

本文作者_TLSN
本文链接https://www.cnblogs.com/lordtianqiyi/articles/16157760.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TLSN  阅读(155)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示