2012-07-18 127 views

回答

27

默认页面大小是由CPU支持的MMU(内存管理单元)所固定的。在32位保护模式的x86支持两种类型的网页:

  • 常年偏多,4个昆明植物研究所
  • 巨大的,4 MIB

并非所有的x86处理器支持大页。需要一个具有页面大小扩展(PSE)功能的CPU。这不包括奔腾处理器之前的版本。几乎所有当代x86 CPU都实现了它。

4 KiB也是其他体系结构中广泛使用的popuplar页面粒度。有人可能会争辩说,这个大小来自将32位虚拟地址分割成页目录/表中的两个10位索引,其余12位给出4 KiB页大小。

+0

4M的巨大页面仅适用于32位模式x86。 64位x86使用2M或1G超大页面,因为4级页表格式使用每层9位。 https://stackoverflow.com/questions/46509152/why-in-64bit-the-virtual-address-are-4-bits-short-48bit-long-compared-with-the。 (非常大的页面大小在长模式下仍然是4k,所以L1DTLB和L1D高速缓存仍然可以基本相同,除其他原因外)。 – 2018-02-24 17:31:26

+0

@PeterCordes,感谢您的评论。我确实只解决了32位模式,这就是我通常用x86表示的。 – 2018-02-25 10:37:46

12

页面大小通常是由处理器架构

看看下面的文章确定That depends on the processor architecture

许多体系结构的默认页面大小为4 KB。通常可以通过切换到huge page模式来增加(有时很多,例如AMD64的1 GB)。这可以使页表更小,这可以提高性能。

17

32位架构的4KB正常的页面大小的设计实际上是非常有趣:)

而且我想添加一个额外的答案,说明为什么它是合理的。

x86使用'2遍'将虚拟内存地址转换为物理内存地址。

因此,假设页面目录和页面表都包含enter image description here条目,页面大小为enter image description here字节。为了充分利用enter image description here地址的,我们有:

enter image description here

在页目录中的每个条目/表占用4个字节(32位),因此:

enter image description here

因此ÿ = 12,以字节为单位的页面大小将为enter image description here = enter image description here = 4KB。


那么'1通'呢?这很有趣,因为逻辑上我们可以使用单个页面表进行地址查找。

假设页面目录包含enter image description here条目,每个条目将地址映射到对应的页面,并且页面大小为enter image description here字节。

再次,充分利用enter image description here地址,我们需要:

enter image description here

和:

enter image description here

我们得到Y = 17,和页面大小为enter image description here = enter image description here = 128KB。

无论如何,这工作“逻辑”。如果我们引入TLB,这样大的内存将成为一个难题:内存页面将难以适应TLB,并且设计效率不高。


我们也可能会争辩说,在'2遍'版本中,页面目录和页面表可能有不同的大小。但是,这意味着我们将使用更大的页面目录,这将占用多个内存页面。可悲的是,每当一个新的用户进程产生时,对于它自己的页面目录,操作系统必须分配连续的页面,这在设计上并不优雅。

+0

正常的术语是“2级页表”,而不是“2次通过”。例如[x86-64使用4级页表](https://stackoverflow.com/questions/46509152/why-in-64bit-the-virtual-address-are-4-bits-short-48bit-long-compared )(仍然有4k常规页面,但是大页面是2M或1G而不是4M)。 – 2018-02-24 17:42:41

+0

您的1级页面表部分提出了一个不必要的假设:页表本身不*有* 1页尺寸。你可以有更小的页面(和一个更加巨大的平面页表)。关于1级的是页表大小:只有少量内存映射的进程可以有一个只有几个底层页表的稀疏树。 TLB根本不是问题;每个TLB包含来自页表的所有级别的完整翻译,因此较大的页面意味着较少的页面位,这意味着较小的CAM。而更少的TLB条目覆盖更多的内存。 – 2018-02-24 17:50:01

0

我添加了这个答案/评论,因为sleepsort的计算非常有趣,我必须将其添加到我的网页(提及课程的来源)。 关于如何以编程方式计算pagesize的问题的(可能的)答案可以在here找到。 按照sleepsort提到的计算方式非常有趣。我对x86_64做了同样的处理,结果并不符合我的预期。然而,进一步阅读memory management x86_64我发现,对于64位英特尔,不使用16位,让我们计算48位。 存储树分支的9位, 每个分支另外9位, 这里在另一个9分支 和最后9位为最后一个分支的树叶。因此存储页面中每个地址的48-36 = 12位。 2^12 = 4096像之前提到的sleeppsort。 我只是想知道这个架构有多少传球,3或4(如果有人能解释) 以下sleepsort的计算:

2^x * 2^x * 2^x * 2^x * 2^y = 2^48 
4x + y = 48 

this time we have 8 bytes for each address (8 bytes * 8 bits/byte = 64 bits) 

2^y/2^3 = 2^x 
y - 3 = x 
filled in in previous equation: 

4(y - 3) + y = 48 
4y - 12 + y = 48 
5y = 60 
y = 12 
because 2^y represents the pagesize, the size = 2^12 = 4096 bytes 

给我一个问题:“怎么样在Linux中那些巨大的页面”?