内存管理之映射概览篇
对于系统,后续想要管理内存,则首先需要做的是需要有入口可以访问到它,也就是我们所说的内存映射的过程:
之前整理过理论部分,本节则主要介绍linux kernel是建立映射关系的过程;
导读
- CPU访问DRAM的图示;
- 建立完成的内存layout 图示;
- kernel映射过程粗略介绍;
1. CPU 访问 DRAM部分
目前的ARMV8体系中,CPU与DRAM的连接如上图所示,分为三个部分:
- CPU 通过总线访问DRAM;
- CPU 使用的虚拟地址经过MMU转换为物理地址;
- 将物理地址通过实际的CA IO线与DRAM实际相连接;
2. 系统使用的mem layout
前置说明:
- CONFIG_PGTABLE_LEVELS=3
- CONFIG_ARM64_VA_BITS_39=y
- CONFIG_ARM64_PAGE_SHIFT=12
上述几个配置,决定了虚拟地址的划分和页表的映射情况:
这里是系统进行初始化完成后得到的虚拟地址的layout图示(实际平台版本):
| 宏 | 说明 | 值 | 定义位置 |
|---|---|---|---|
| KERNEL_LOAD_ADDR_PHYS | lk load kernel image的位置 | 0x8 0008 0000 | updrade.h |
| KIMAGE_VADDR | kernel image的虚拟地址起始位置 | 0xFFFF FFF8 0800 0000 | arch/arm64/include/asm/memory.h |
| TEXT_OFFSET | stext的位置偏移,即kernel image开始执行的code位置 | 0x0008 0000 | arch/arm64/Makefile |
| PAGE_OFFSET | kernel空间中线性地址和vmlloc的区分值 | 0xFFFF FFBF FFFF FFFF | arch/arm64/include/asm/memory.h |
详细打印:
3. 映射过程
从这里也可以看的出来,本部分仅仅概括性的描述了内存映射的过程,接下来会逐步将相关的过程完善完成:
- 从物理地址到能够访问kernel 空间;
- 建立fixmap机制,添加FDT映射;
- 建立memblock机制,可以申请和释放物理内存;
- paging_init 通过上述机制 建立完整映射关系;