站在处理器的角度来看,管理内存的最小单位是页。
在linux内核中,一个页的大小是4KB,管理一个页的数据结构为struct page,每个页面都有自己的编号pfn。struct page的地址存储在mem_map[]数组中。
1. pfn与mem_map[]
对于一个计算机系统,其整个物理地址空间应该是从0开始,到实际系统能支持的最大物理空间为止的一段地址空间。在ARM系统中,假设物理地址是32个bit,那么其物理地址空间就是4G,在ARM64系统中,如果支持的物理地址bit数目是48个,那么其物理地址空间就是256T。当然,实际上这么大的物理地址空间并不是都用于内存,有些也属于I/O空间(当然,有些cpu arch有自己独立的io address space)。因此,内存所占据的物理地址空间应该是一个有限的区间,不可能覆盖整个物理地址空间。
PFN是page frame number的缩写,所谓page frame,就是针对物理地址空间而言的,把物理地址空间分成一个个的page size的区域,并且给每一个page 编号,这个号码就是PFN。假设物理内存从0地址开始,那么PFN等于0的那个页帧就是0地址(物理地址)开始的那个page。假设物理内存从x地址开始,那么第一个页帧号码就是(x>>PAGE_SHIFT)。
总结一下,
1.mem_map[index] 数组的index 和 pfn 之间是存在一个固定的偏移(与芯片的layout相关;
2.pfn对应了整个物理地址空间,而mem_map[]只管理了用于内存的区间;
3.比如arm32有4G的物理地址空间,对于某个物理地址x来说,它的pfn就是x>>12(4KB页面),现在假设DDR只有1G,那么mem_map[]就只是对应这个1G空间,但pfn是对应了整个4G的空间
2. zone
| 层次 | 说明 |
|---|---|
| Node(存储节点) | CPU被划分成多个节点,每个节点都有自己的一块内存,可以参考NUMA架构有关节点的介绍 |
| Zone(管理区) | 每一个Node(节点)中的内存被划分成多个管理区域(Zone),用于表示不同范围的内存 |
| Page(页面) | 每一个管理区又进一步被划分为多个页面,页面是内存管理中最基础的分配单位 |

2274

被折叠的 条评论
为什么被折叠?



