memory virtualization: shadow page & nest page

本文探讨了标准pagewalk、软件shadowpage和硬件nestedpage三种页表虚拟化技术,涉及虚拟地址转换、性能代价、维护成本及优势对比,适合理解系统层面的虚拟化原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录



前言

虚拟化是一个比较复杂的概念,包括硬件抽象层级别的虚拟化,操作系统层面的虚拟化,以及库函数的虚拟化,还有编程语言层面的虚拟化。java virual machine就是编程语言层面的虚拟化,可以实现跨平台的运行。

本文指的虚拟化是在系统层面,一个host 系统上运行多个guest系统。当然这也是一个比较大的话题,先介绍最近学习的页表虚拟化。


一、标准page walk

在这里插入图片描述
标准table walk 如上图所示,程序使用的虚拟地址通过页表,得到实际的物理地址。其中Page Table Base Address,指向table1的基地址。假设地址为48bit,PTE为8B。则8B*2^9 = 4KB.

使用虚拟地址[47:39],索引L1级页表,得到L2级页表的页基地址。使用[38:30]索引L2级页表,得到L2级页表的页基址。最终,在L4级页表得到实际物理页面地址,加上页内偏移,可以得到物理地址。


二、软件页表虚拟化 shadow page


上图a)为硬件页表虚拟化,b)为软件页表虚拟化。

软件页表虚拟化为VMM使用的shadow page技术。

在软件页表虚拟化中,host系统将会维护一套shadow page,称为影子页表。这份影子页表维护了从gVA→sPA的映射,这份页表直接通过物理MMU进行访问,因此在tlb miss时,可以按照正常的访问,即4次即可得到va对应的pa。
在这里插入图片描述
但是,软件维护这份影子页表,消耗很大。

首先,对应每一个用户的每一个进程,都需要维护一份影子页表。此外,host VMM是通过guest发出异常来维护影子页表的:每次guest对guest的页表的属性,地址分配等进行更改,host系统为了能够同步到shadow page,都需要guest发出异常,进入host,host改动shadow page。考虑每个进程又都有自己的影子页表,这样做的性能损失代价很大。


三、硬件页表虚拟化 nested page

nested-paging是目前通用的页表虚拟化技术,Intel,AMD,ARM都有使用。

guest系统中的页表维护的地址映射是guest VA→guest PA,缩写为gVA→gPA。但是此时的gPA,只是在guest系统的角度,是物理地址。实际上因为多个guest运行在host/hypervisor上,所以host会维护一份host页表,将gPA映射为sPA。即将gPA映射为真实的PA。因此实际上gPA也是一个虚拟地址。

当然,TLB中维护的映射仍为guest VA→host PA,这样才能保证系统性能。不过,既然guest的页表最终输出的结果仍是虚拟地址,那么当guest发生TLB miss时,就需要进行特殊的处理,才能访问真正的物理地址。这就是本片要讲的内容。

Nested Paging地址转换
如上图所示,guest使用gCR3,指向guest系统的页表基地址。host系统使用nCR3,指向host系统的页表基地址。因为gCR3指向的地址也是gPA,并且guest内部每次翻译得到的L2/L3/L4页表基地址也是gPA(上文讲过,gPA本质上也是虚拟地址),因此这些gPA都需要经过host address translation,才能得到L2/L3/L4页表基地址的真实的sPA。
经典地址转换与nested paging地址转换的流程图
如上图所示,b)中即为nested paging 发生tlb miss时,需要进行的页表查询次数。因为每次都需要对页基地址进行翻译,所以如果查询guest页表结构为n级,host页表结构为m级,那么翻译页表的gPA就需要n * m次 ,又因为最终获得的gPA还需要通过host页表进行查询,因此最后又需要m次,总计需要:

  1. n(guest page walk)
  2. n * m(翻译所有的页表对应的sPA)
  3. m (最后一轮翻译gPA)

即为n+n*m+m。图中,guest和host都是4级页表,因此就需要24次查询。

相比于经典的4次,还是增加了很多的访问时间。

但是相比于shadow page,nested page可以通过一份host页表,支持多个guest,多个进程;并且guest对页表的更改,不需要进入host的介入,因此减少了系统状态的切换和维护页表的数目。此外,通过引入page walk cache,将页表的内容进行缓存,虽然相对于shadow page访问页表的次数增加,但是如果cache命中率足够高,相对于shadow page,仍然更具优势。


四、对比

在这里插入图片描述
如图所示:

  1. nested page tlb miss时访问memory次数增加到24,并且nested page walk需要硬件支持
  2. shadow page的page table更新代价大,需要VMM的支持。

——————欢迎关注我的公众号《处理器与AI芯片》

### 解决方案概述 当面对Android Studio中的SDK和HAXM不可用问题时,可以采取一系列措施来解决问题并确保开发环境正常工作。这不仅涉及重新安装配置Android SDK,还包括处理硬件加速扩展管理(HAXM)的相关设置。 #### 一、确认当前状态 在尝试任何修复之前,建议先验证现有的SDK工具链是否已正确安装,并检查是否有可用的更新。可以通过打开`Tools -> SDK Manager`菜单项来进行这项操作[^1]。 #### 二、重新安装或更新Android SDK 对于SDK无法正常使用的问题,可能是因为某些组件未被正确下载或是版本不匹配所引起的。此时应该考虑完全卸载后再重装整个SDK包: 1. **移除旧版SDK** - 进入`File -> Settings (Ctrl+Alt+S)`路径下的`Appearance & Behavior -> System Settings -> Android SDK`页面; - 取消勾选所有已安装的平台及其附加软件包; - 应用更改以完成删除过程。 2. **获取最新版SDK** - 同样是在上述设置界面内,点击左上角的“Edit”按钮旁的小三角形展开更多选项; - 选择`SDK Tools Only`模式以便单独挑选所需工具集; - 勾选必要的API级别和其他依赖资源(如NDK, CMake等),特别是要确保选择了最新的Build-tools版本; - 安装完成后重启IDE使改动生效。 #### 三、解决HAXM Unavailable问题 针对HAXM不可用的情况,通常与虚拟化技术的支持有关。按照以下步骤排查并修正该问题: - **启用VT-x功能** 许多现代CPU支持Intel VT-x指令集用于增强型虚拟化性能,但在默认情况下可能是关闭的状态。因此需要进入计算机BIOS/UEFI固件设置界面上查找名为Virtualization Technology或者类似的开关将其开启。 - **调整内存分配给HAXM** 有时由于预设值过低而导致模拟器表现不佳甚至根本无法启动。为了改善这种情况,可以从命令行执行如下脚本来增加分配量至合理范围之内: ```bash sudo sh ~/Library/Android/sdk/extras/intel/Hardware_Accelerated_Execution_Manager/silent_install.sh -u ``` 接着再次运行相同路径下的installer文件,这次指定更大的RAM大小作为参数传递进去,比如4GB: ```bash sudo ./silent_install.sh -m 4096 ``` > 注意:以上命令适用于macOS系统;Windows用户则需前往对应位置双击exe可执行文件进行图形化向导式的重新安装流程。 - **禁用Hyper-V服务(仅限于Windows操作系统)** 如果正在使用的机器开启了微软自家提供的Hyper-V特性,则可能会干扰到其他类型的hypervisor运作方式从而阻碍了HAXM的功能实现。可通过PowerShell终端输入下面这条语句快速停用它: ```powershell Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All ``` 最后记得保存所做的全部变更并将电脑彻底断电再开机一次让新的设定能够真正起效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值