专栏首页酷酷的哀殿为什么 Linux 默认页大小是 “4KB”?

为什么 Linux 默认页大小是 “4KB”?

经常看到一些博客在讲 Linux 内存的 PAGE SIZE 时,都会提到 Linux 默认页大小是 4KB

笔者通过搜索找到了一些与 PAGE SIZE 相关的资料,希望对读者有所帮助。

因为微信不支持外链,建议点击文章底部的“阅读原文”进行阅读。

1、Linux 默认页大小不是 4KB

首先,我们先看看 Linux 默认页大小是 4KB 是否能够成立?

通过 github 以 #define PAGE_SHIFT 为关键字在 linux 仓库进行搜索,可以得到一个 GitHub 搜索结果页 [1]。

很遗憾, GitHub 搜索结果页的第一个结果就不满足题目中的 4KB 要求。

现将第一个结果 linux/arch/openrisc/include/asm/page.h 的部分代码摘录如下 [2]。

 /* PAGE_SHIFT determines the page size */

 #define PAGE_SHIFT     13
 #ifdef __ASSEMBLY__
 #define PAGE_SIZE       (1 << PAGE_SHIFT)
 #else
 #define PAGE_SIZE       (1UL << PAGE_SHIFT)

openrisc 架构下, PAGE SIZE 是 8 Kbyte (2^13)。

2、Linux 默认页大小是对应架构的 MMU 管理的最小值

本结论来自一篇2002年的文章 Multiple Page Size Support in the Linux Kernel [3]。

The Linux kernel currently supports a single user space page size, usually the minimum dictated by the architecture. This paper describes the ongoing modifications to the Linux kernel to allow applications to vary the size of pages used to map their address spaces and to reap the performance benefits associated with the use of large pages.

我们仍然以 openrisc 架构为例,在OpenRISC 1000Architecture Manual 的 8.1 MMU FEATURES [4] 提到 page size 存在3种,最小是 8 Kbyte

Three different page sizes:

 Level 0 pages (32 Gbyte; only with 64-bit EA) translated with D/I Area Translation Buffer (ATB)

 Level 1 pages (16 MByte) translated with D/I Area Translation Buffer (ATB)

 Level 2 pages (8 Kbyte) translated with D/I Translation Lookaside Buffer (TLB)

这份数据可以与上一节的 #define PAGE_SHIFT 13 相互印证。

3、x86 架构下,Linux 默认页大小是 4Kb

x86 架构下,Linux 默认页大小是 4Kb 的原因很简单,x86 的 MMU 管理的最小值就是 4k。

数据来源: Virtual Memory and Linux [5]

 ARM – 4k
 ARM64 – 4k or 64k
 MIPS – Widely Configurable
 x86 – 4k

4、Linux 的默认大小会控制在 16K 以内

本结论来自一篇 Linus Torvalds 的吐槽文章 Some alternatives for alias handling [6]。

4kB is good. 8kB is borderline ok. 16kB or more is simply not acceptable.

参考文章

  1. https://github.com/search?l=C&q=%23define+PAGE_SHIFT+repo%3Atorvalds%2Flinux+path%3Aarch&type=Code
  2. https://github.com/torvalds/linux/blob/5b8b9d0c6d0e0f1993c6c56deaf9646942c49d94/arch/openrisc/include/asm/page.h#L21
  3. https://www.kernel.org/doc/ols/2002/ols2002-pages-573-593.pdf
  4. https://openrisc.io/or1k.html#__RefHeading__504779_595890882
  5. https://elinux.org/images/4/4c/Ott.pdf
  6. https://www.realworldtech.com/forum/?threadid=144991&curpostid=145006

本文分享自微信公众号 - 酷酷的哀殿(kukudeaidian),作者:酷酷的哀殿

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Swift Module Interfaces

    今天看到一篇讲 Swift Crash 的文章一个 Swift Crash 引发的讨论...原文作者从Swift源码和UIKitCore -[UIView(UI...

    酷酷的哀殿
  • llvm 编译器高级用法:第三方库插桩

    最近看到一篇有意思的技术文章:《抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15%》。

    酷酷的哀殿
  • lldb入坑指北(4)-打印任意函数的汇编代码

    如果希望看到另外一个函数或方法的指令,通常需要打开另外的工具。比如 Hopper。

    酷酷的哀殿
  • 开源流程推动软件定义的一切

    Linux Foundation(LF)一直在悄悄推动工业革命。它正在引发对软件定义的一切的独特变革,这代表了垂直行业的根本转变。 LF在9月24日发布了一份广...

    YH
  • 不要在问Linux优化从何入手了,好好看看

    作为一个程序员,性能优化是无法避开的事情,不管是桌面应用还是web应用,不管是前端还是后端,不管是单点应用还是分布式系统,并且性能优化也是软件系统中最有挑战的工...

    用户1634449
  • WordPress素锦-超级美的小众博客自适应主题

    Ghost:https://github.com/PeterCxy/ghost-diaspora Hexo:https://github.com/Fechin/...

    AlexTao
  • 动态自适应盲视频超分辨率(CS CV)

    大多数传统的监督超分辨率(SR)算法假设低分辨率(LR)数据是通过具有固定已知核的高分辨率(HR)数据进行降尺度获得的,但这样的假设在实际场景中往往不成立。最近...

    凌茜
  • 说真的,前端对Linux需要了解到什么程度?

    还记得土哥刚入行,进第一家公司实习的时候,使用的是Win7,对于Windows下的命令行体验真是无力吐槽,特别是对于Web前端来说,非常多的工具都运行在终端内,...

    闰土大叔
  • 资源 | GitHub万星:适用于初学者的TensorFlow代码资源集

    机器之心
  • Redis Web界面管理工具

    一个很友好的Redis Web界面管理工具。基于.NET实现。可以通过Mono部署到Linux上,下面是我部署在CentOS 5.7 + Mono 2.10.8...

    张善友

扫码关注云+社区

领取腾讯云代金券