Linux内核源码分析 (B.x)Linux物理内存的初始化
文章目录
- Linux内核源码分析 (B.x)Linux物理内存的初始化
- 一、DDR简介
- 二、内存节点
- 三、内存管理区域ZONE
- 四、 struct zone
- 五、 struct page
- 六、mem_map数组
- 七、伙伴系统简介
- 八、迁移类型
- 九、内存初始化
- 十、总结
一、DDR简介
- 详细可见《深入理解计算机系统》(6)存储器层次结构 1.1.4节内存模块
二、内存节点
- 内核使用
pglist_data
来描述一个内存节点
三、内存管理区域ZONE
- 为什么要有ZONE?
为了支持NUMA模型,系统的物理内存被划分为几个节点(node),节点又划分成内存管理区域(zone)。Linux内核对不同区域的内存需要采用不同的管理方式和映射方式。 - ARM32架构的zone划分为
ZONE_NORMAL
和ZONE_HIGHMEM
,x86架构里还有ZONE_DMA
四、 struct zone
- cache line :高速缓存行
五、 struct page
六、mem_map数组
- 简单来说,
mem_map
数组存放了struct page
数据结构 - 这里讲到了描述物理页面的数据结构
struct page
和页帧号pfn
之间的转换,具体可以看下面这张图,更多信息可以参考
七、伙伴系统简介
- 伙伴系统的部分参考《深入理解计算机系统》第9章虚拟内存
八、迁移类型
九、内存初始化
- 与x86等体系结构不同,ARM体系结构中只有
Normal Zone
和HighMem Zone
,注意总计有194560+67584=242144页
,为啥不用考虑存放mem_map[]
数组的1520
页,我猜测那两个数值已经包含在里面了…