物理内存三大金刚:node-zone-page
每张内存条在内核中叫一个node
在linux内核中用pglist_data来描述一个node,每个node分成了多个zone,每个zone分成了11个free_area,每个free_area存储了不同大小的页表分别有11种(2^0个page,2^1个page... 2^10个page),每一种大小的页表链又被分到了6种状态子链表(根据页表是否能够移动MOVEABLE等)
最后巩固一下,计算一些有趣有体感的数字:
1. 假设系统只有1个node,每个node有DMA、DMA32、NORMAL3种zone,总的有多少个list_head的链表?
1node * 3zone * 11area * 6type * 1list/type = 198个链表,并且这198个链表中page大小只有11种,而且每种大小的链表有=18个。
2. 如果系统有4G的物理内存,有多少个page,假设page全部在问题1中zone NORMAL上,如果每个链表上挂载的listnode节点相同,那么这个节点数量是多少?
page数:4G/ (4K/page) = 1M pages = 100万 page
大小类型数:1node * 1zone * 11area = 11个大小类型
假设每个大小的链表都挂载x个node
(2^0+2^1+...2^10) * x = 100w
也就是:2^11 * x = 100w = 2^20
所以x = 2^9=512个
所以每种大小的page平均有512个。
进一步由于每种page的有6种状态的list,所以每种状态数量是 512/6 ≈ 86个节点
(所以假设每种大小都一样多,每个list挂载都一样多,那么每个链表会挂载86个节点,小于100的数量级)
综述,所以Linux内核中物理内存是如何组织起来的?
- 是基于page的,按照node-zone-area-type-list五级管理机制管理物理内存
- 将物理内存根据不同需求分成不同的地带(zone)类似全球根据气候分成热带、温带
- 然后每个地带将物理内存是按照页为单位管理
- 然后将这些页按照2^n个大小分成11种大小的页,分别是1个页,2个页.. 最大的是1024个页
- 然后每种大小的簇 自己又根据状态分成了六个类型组type,每个组里面挂list_head的链表