Linux内核采用页式存储管理,进程的地址空间被划分成固定大小的“页面”;物理内存同样被分为与页面大小相同的“页帧”,由MMU在运行时将虚拟地址“映射”成某个物理内存页面上的地址。
本文以linux-2.6.32-220.el6版本内核源码为基础,介绍Linux内核中有关物理内存的概念,和如何描述物理内存。注意:本文中涉及到的仅是和物理内存有关的概念、数据结构。和地址如何映射、线性地址、物理地址;内存如何分配/回收等概念无关。
目录
1 概述… 3
2 物理内存相关概念… 3
2.1 NUMA(Non Uniform Memory Access)… 3
2.2 页面和虚拟内存(Paging and Virtual Memory)… 5
2.2.1 PAE(Physical Address Extensions)… 6
2.2.2 PSE(Page Size Extensions)… 6
2.3 TLB(Translation Lookaside Buffers)… 7
3 Linux内核对物理内存描述… 7
3.1 节点(Node)… 8
3.2 区域(Zone)… 10
3.2.1 区域类型… 10
3.2.2 struct zone结构体… 13
3.3 页面(Page)… 15
3.3.1 struct page结构体… 15
3.3.2 页面标志… 17
4 Linux物理内存描述信息查看… 19
4.1 /proc/zoneinfo. 19
4.2 /proc/pagetypeinfo. 19
4.3 /sys/devices/system/node/node*/meminfo. 19
4.4 echo m > /proc/sysrq-trigger 20
点击下载:Linux物理内存描述
PAE机制打开后,是36位的物理地址吧,最大64GB内存。
打开PAE机制后,是36位物理地址。但对于进程来说,地址空间仍然是32位的。
PAE机制打开后,对进程而言,可用的物理内存仍然是4G,那怎么理解,可用的物理内存空间变大了?MMU的映射是随机的吗,是说可选的范围多了,这次某个进程可用的4G物理空间,可能只是其中一段4G,而下次,可能是截取的另一段,可以这么理解吗?
关于struct page中的index的说明,有两处不太理解:
I). “若页面是属于一个文件的映射,则index是该页面在文件中的偏移量”
II). “若页面是交换缓冲区的一部分,则index是该页面在address_space交换地址空间的偏移量swapper_space”
该页面在文件中的偏移量,怎么叫页面在文件中的偏移量?
2.2.2里,按照我的理解x86_64巨页的大小应该是2M?而不是4M?
是2MB。