Linux内核在x86架构上的默认内存页大小是4 KB,我想知道这是如何计算的,为什么?为什么Linux(x86)的页面大小是4 KB,这是如何计算的?
回答
默认页面大小是由CPU支持的MMU(内存管理单元)所固定的。在32位保护模式的x86支持两种类型的网页:
- 常年偏多,4个昆明植物研究所
- 巨大的,4 MIB
并非所有的x86处理器支持大页。需要一个具有页面大小扩展(PSE)功能的CPU。这不包括奔腾处理器之前的版本。几乎所有当代x86 CPU都实现了它。
4 KiB也是其他体系结构中广泛使用的popuplar页面粒度。有人可能会争辩说,这个大小来自将32位虚拟地址分割成页目录/表中的两个10位索引,其余12位给出4 KiB页大小。
我从维基百科的文章得到了这一点,我引述如下:
:
页面大小通常是由处理器架构
看看下面的文章确定That depends on the processor architecture。
许多体系结构的默认页面大小为4 KB。通常可以通过切换到huge page模式来增加(有时很多,例如AMD64的1 GB)。这可以使页表更小,这可以提高性能。
32位架构的4KB正常的页面大小的设计实际上是非常有趣:)
而且我想添加一个额外的答案,说明为什么它是合理的。
x86使用'2遍'将虚拟内存地址转换为物理内存地址。
因此,假设页面目录和页面表都包含条目,页面大小为字节。为了充分利用地址的,我们有:
在页目录中的每个条目/表占用4个字节(32位),因此:
因此ÿ = 12,以字节为单位的页面大小将为 = = 4KB。
那么'1通'呢?这很有趣,因为逻辑上我们可以使用单个页面表进行地址查找。
假设页面目录包含条目,每个条目将地址映射到对应的页面,并且页面大小为字节。
再次,充分利用地址,我们需要:
和:
我们得到Y = 17,和页面大小为 = = 128KB。
无论如何,这工作“逻辑”。如果我们引入TLB,这样大的内存将成为一个难题:内存页面将难以适应TLB,并且设计效率不高。
我们也可能会争辩说,在'2遍'版本中,页面目录和页面表可能有不同的大小。但是,这意味着我们将使用更大的页面目录,这将占用多个内存页面。可悲的是,每当一个新的用户进程产生时,对于它自己的页面目录,操作系统必须分配连续的页面,这在设计上并不优雅。
正常的术语是“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
您的1级页面表部分提出了一个不必要的假设:页表本身不*有* 1页尺寸。你可以有更小的页面(和一个更加巨大的平面页表)。关于1级的是页表大小:只有少量内存映射的进程可以有一个只有几个底层页表的稀疏树。 TLB根本不是问题;每个TLB包含来自页表的所有级别的完整翻译,因此较大的页面意味着较少的页面位,这意味着较小的CAM。而更少的TLB条目覆盖更多的内存。 – 2018-02-24 17:50:01
我添加了这个答案/评论,因为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中那些巨大的页面”?
- 1. 为什么x86是小端的?
- 2. 页面大小和页面表项大小有什么区别
- 3. 这是为什么 - 而计算是错误的?
- 4. 在android中计算Json数组大小以Kb还是Mb为单位?
- 5. Linux是如何计算MemFree
- 6. 这两个页面为什么有不同的列大小?
- 7. 在Linux上,为什么我们的页面大小如此之大(60GB)。每个进程是否获得副本?
- 8. 什么是计算Windows文件夹大小的最快方法?
- 9. 在linux中的可变页面大小
- 10. x86架构中的“EU”是什么? (计算有效地址?)
- 11. 为什么不是这个为@each计算的属性射击?
- 12. 为什么在这里打包结构5而不是4字节的大小?
- 13. 如何计算单位为KB
- 14. 为什么在Rust中'char'的大小是4个字节?
- 15. 什么是最低VM预算大小?
- 16. 什么是fb页面标签的新大小?
- 17. 什么是适合iPad的PDF页面大小(dpi)?
- 18. 这是什么linux结构
- 19. 在任何x86处理器上是否存在最小页面大小?
- 20. 如何计算这4天
- 21. 为什么我的页面大小与维基百科相比如此之大?
- 22. 为什么这个结构体12的大小不是10?
- 23. 这些表为什么是相同的大小?
- 24. 如何获取UIImage的大小(KB)
- 25. Linux x86 64是否同时拥有2M和4K页面?
- 26. pdf2json页面单位:这是什么?
- 27. Google提供的所有这些0 kB .gifs是什么?
- 28. 什么是Linux diff -y的算法?
- 29. 页表条目大小 - 为什么是2的幂次?
- 30. 计算器的计划是什么?
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
@PeterCordes,感谢您的评论。我确实只解决了32位模式,这就是我通常用x86表示的。 – 2018-02-25 10:37:46