-
-
[翻译]虚拟化是如何工作的(第二部分 内存虚拟化)
-
发表于:
2018-11-16 18:42
8553
-
[翻译]虚拟化是如何工作的(第二部分 内存虚拟化)
在上一部分,我们已经讨论了处理器虚拟化。那么内存虚拟化呢?如果对内存随意修改,内存很可能会挂,所以在解释VMM怎样控制内存之前,我们先了解一下内存的结构。
内存通常被认为是线性分布的,内存单元用来存储字节,分布在0x00000000-0xFFFFFFFF的32位地址供CPU调用。
但对于现在的大多数计算机来说,以上描述已不适用(小型嵌入式系统有时会以这种方式处理内存以节省资源)。相反,现代计算机使用内存管理单元(MMU),它在CPU中负责将虚拟地址转化为物理地址(虚拟与虚拟化无关,只是名字相似)
地址的转换使用了分页机制,分页的理解重点在计算部分。我们取4KB的物理内存,将其基地址存储到一个表项中。这4KB内存称为一页,这个表称为页表(PT)。因特尔手册中定义一个PT可以保存512个页。按照每个页4KB计算,大概可寻址2MB的内存。但是我们想寻址更多内存,所以我们将512个页表的物理地址存储到一个页目录项(PDE)中。计算一下,每个PDE有1GB的内存。这些内存还不够,我们继续将512个PDE的物理地址存储到一个页目录指针表项(PDPTE)中。然后,将512个PDPTE的物理地址存储到一个PML4E中。
物理地址可以理解为“内存中的第0xffec1230个字节”。而虚拟地址则包含不同指针表的所有索引,用于将MMU指引到正确的字节。
64位虚拟地址(9位可表示0-511)的含义如下:
63-48位:16位地址扩展;
47-39位:9位PML4偏移;
38-30位:9位PDPT偏移;
29-21位:9位页目录偏移;
20-12位:9位页表偏移;
11-0位:12位页内偏移;
举个例子,虚拟地址0x00000000007FC031写成二进制形式为:
该虚拟地址的含义为:基于虚拟地址,MMU查找PML4的第一项(索引为0),保存着PDPT的物理地址。继续查找,PDPT的第一项保存着PD的物理地址。在PD中查找第四个PT,在PT中查找第509项的指针。该指针将MMU指引到一个页,该页的第50位表示读或写。
要时刻记得,每个表项的实际物理地址由两部分组成。存储在表项中的物理地址的前导位,加上虚拟地址的索引,这两部分共同构成一个有效的物理地址。
也许你已经知道,64位计算机的总线地址大多时候只使用48位。所以在实际的处理器中内存地址只有48位,而不是64位。这意味着指向下一表项的指针并没有64位,但每个表项是64位,所以下一表项的指针不能占用所有位。
实际上,这48位中,存储着最后一个指针的前36位,索引占9位,还余3位。这3位是填充位,如果索引由字节构成,这3位会用来表示索引。
分页机制有利有弊:内存管理单元(MMU)必须将虚拟地址转换为物理地址,这意味着处理器需要花更多时间访问内存。但同时,可以利用它做更多有趣的事。
因为指向下一表项的指针不能占用所有64位(只占用36位),剩下的位就用来做标记位。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2018-12-28 17:54
被Green奇编辑
,原因: