内存管理之映射概览篇

对于系统,后续想要管理内存,则首先需要做的是需要有入口可以访问到它,也就是我们所说的内存映射的过程:
之前整理过理论部分,本节则主要介绍linux kernel是建立映射关系的过程;

导读

  1. CPU访问DRAM的图示;
  2. 建立完成的内存layout 图示;
  3. kernel映射过程粗略介绍;

1. CPU 访问 DRAM部分

Linux内存映射实现框架

目前的ARMV8体系中,CPU与DRAM的连接如上图所示,分为三个部分:

  1. CPU 通过总线访问DRAM;
  2. CPU 使用的虚拟地址经过MMU转换为物理地址;
  3. 将物理地址通过实际的CA IO线与DRAM实际相连接;

2. 系统使用的mem layout

前置说明:

  1. CONFIG_PGTABLE_LEVELS=3
  2. CONFIG_ARM64_VA_BITS_39=y
  3. CONFIG_ARM64_PAGE_SHIFT=12

上述几个配置,决定了虚拟地址的划分和页表的映射情况:

Linux内存映射实现框架
这里是系统进行初始化完成后得到的虚拟地址的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

详细打印:
Linux内存映射实现框架

3. 映射过程

Linux内存映射实现框架

从这里也可以看的出来,本部分仅仅概括性的描述了内存映射的过程,接下来会逐步将相关的过程完善完成:

  1. 从物理地址到能够访问kernel 空间;
  2. 建立fixmap机制,添加FDT映射;
  3. 建立memblock机制,可以申请和释放物理内存;
  4. paging_init 通过上述机制 建立完整映射关系;

相关文章: