一、层级关系
二、Linux内存模块
内存架构
SMP架构(UMA架构)
这种架构简单方便容易理解,但并发时如果CPU核数较多会产生较大的竞争关系。
NUMA架构
物理内存管理模块
Linux内核是如何获取内存条信息的:
- 主板提供的功能:e820中断(BIOS中断,只能获取基础信息,判断是否可用,功能很弱,SMP架构可以通过它来获取)
- ACPI规范获取NUMA节点信息
e820中断基础信息:
ACPI规范:
虚拟内存分页
X86_64运行模式
- 实模式16(无虚拟内存)
- 保护模式32(开分页和不开分页,不开分页只有物理地址)
- 兼容模式64(必须开分页,64位OS运行32位)
- 长模式64
内存地址
- 逻辑地址:代码中看到的地址
- 线性地址:又称为虚拟地址,段机制运算出来的
- 物理地址:页机制(MMU+TLB)运算出来的
注:
CPU读写数据的本质:通过逻辑地址进行运算得出物理地址。 CPU管理内存通过两个部件:段部件和页部件。
缺页异常
缺页异常-中断捕获-挂物理页 pte
写时复制
当一个子进程通过fork被创建时,内核仅仅把父进程的页框赋给子进程的地址空间,但是把这些页框标记位只读。一旦父进程或者子进程有试图修改页中的内容时,内存管理单元(MMU)抛出一个异常。异常处理程序把新的页框赋给受影响的进程,并用原来页中的内容初始化新页框,重新向MMU发出执行该task的写操作。