如何确定虚拟地址空间中的页面大小?


43

Linux使用虚拟内存系统,其中所有地址都是虚拟地址,而不是物理地址。这些虚拟地址由处理器转换为物理地址。

为了简化翻译,将虚拟和物理内存分为页面。每个页面都有一个唯一的编号;页面框架号。

某些页面大小可以是2 KB,4 KB等。但是如何确定此页面大小数字?它受体系结构大小的影响吗?例如,一个32位总线将具有4 GB的地址空间。

Answers:


56

您可以通过以下getconf命令查询系统的配置来找出系统的默认页面大小:

$ getconf PAGE_SIZE
4096

要么

$ getconf PAGESIZE
4096

注意:上述单位通常以字节为单位,因此4096等于4096字节或4kB。

这是Linux内核的源代码中的硬连线:

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

移位如何给您4096?

移位位时,您将执行2的二进制乘法。因此,实际上,将位向左移(1 << PAGE_SHIFT)就是2 ^ 12 = 4096的乘法。

$ echo "2^12" | bc
4096

2
现代硬件支持2MB和1GB的页面大小。是否可以将2MB页面的“ PAGE_SHIFT”设置为21,作为内核构建的默认设置?
ReverseFlow '18

2
@ReverseFlow为了得到这样的回答,我会问一个单独的问题。
Kirill Bulygin '18年

@sim,想知道为什么在这里使用位操作?我读到,编译器通常会将乘法转换为位操作,因此具有相同的性能。
InAFlash

17

硬件(特别是CPU的一部分MMU)确定可能的页面大小。与处理器寄存器的大小无关,而与地址空间的大小间接相关(因为MMU决定了两者)。

几乎所有架构都支持4kB页面大小。有些架构支持较大的页面(有些还支持较小的页面),但是4kB是非常普遍的默认设置。

Linux支持两种页面大小:

  • 普通大小的页面,我认为在所有体系结构上默认为4kB,尽管某些体系结构允许其他值,例如ARM64上为 16kB或IA64 8kB,16kB或64kB 。这些对应于MMU上最深层次的描述符(Linux称为PTE)。
  • 巨大的页面,如果使用(CONFIG_HUGETLB_PAGE必须,并且CONFIG_HUGETLBFS对于大多数使用也是)编译的。这对应于MMU描述符的第二个最深层次(Linux称为PMD)(或者至少通常如此,我不知道这是否适用于所有体系结构)。

页面大小是内存使用量,内存使用量和速度之间的折衷。

  • 页面大小较大意味着部分使用页面时会浪费更多,因此系统会更快地耗尽内存。
  • 更深的MMU描述符级别意味着页表有更多的内核内存。
  • 更深的MMU描述符级别意味着更多的时间用于页表遍历。

对于大多数应用程序而言,较大页面大小的收益很小,而成本却很高。这就是为什么大多数系统仅使用普通大小的页面的原因。

您可以使用getconf实用程序或C函数查询系统上的(正常)页面大小sysconf

$ getconf PAGE_SIZE
4096

使用大页面需要挂载hugetlbfs文件系统并mmap在此处ping文件。


仅供参考:使用大页面不需要挂载ugeltlbfs,因为该内核文档在底部指出,您还可以使用共享内存调用或mmap标志。另外,更有趣的是,您可以启用透明的大页面,然后内核将在所有应用程序中尽可能地将正常页面自动转换为大页面。
德罗伯特2014年

这是真正的根本答案。Linux仅设计为很好地使用分页硬件。有关分页的更多详细信息:stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli新疆改造中心法轮功六四事件

0

页面大小主要取决于处理器体系结构。在x86上,从引入保护模式的386处理器开始,页面大小一直为4 kB。

在x64模式下,也可能会有大页面,大小为2 MB。但是,使用它们有点复杂。

您可以在Wikipedia文章中找到有关页面大小的更多信息。


0

处理器确定可用的页面大小。对于大多数目的,x86和x86_64处理器上的硬件实现的页面大小为4kb。但是,如果需要,操作系统一次可以分配多个页面,从而可以在软件中有效地实现8kb,16kb或32kb的页面。

x86和x86_64处理器还可以分别混合4mb和2mb页面以及标准的4kb页面。如果完全使用了该功能,则通常将其用于分配内核空间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.