Linux内存工作

253 阅读2分钟

一、层级关系

1707009995030.jpg

二、Linux内存模块

image.png

内存架构

SMP架构(UMA架构)

image.png 这种架构简单方便容易理解,但并发时如果CPU核数较多会产生较大的竞争关系。

NUMA架构

image.png

物理内存管理模块

Linux内核是如何获取内存条信息的:

  1. 主板提供的功能:e820中断(BIOS中断,只能获取基础信息,判断是否可用,功能很弱,SMP架构可以通过它来获取)
  2. ACPI规范获取NUMA节点信息

e820中断基础信息:

image.png

ACPI规范:

image.png

虚拟内存分页

X86_64运行模式

  • 实模式16(无虚拟内存)
  • 保护模式32(开分页和不开分页,不开分页只有物理地址)
  • 兼容模式64(必须开分页,64位OS运行32位)
  • 长模式64

内存地址

  • 逻辑地址:代码中看到的地址
  • 线性地址:又称为虚拟地址,段机制运算出来的
  • 物理地址:页机制(MMU+TLB)运算出来的

注:

CPU读写数据的本质:通过逻辑地址进行运算得出物理地址。 CPU管理内存通过两个部件:段部件和页部件。

缺页异常

缺页异常-中断捕获-挂物理页 pte

写时复制

当一个子进程通过fork被创建时,内核仅仅把父进程的页框赋给子进程的地址空间,但是把这些页框标记位只读。一旦父进程或者子进程有试图修改页中的内容时,内存管理单元(MMU)抛出一个异常。异常处理程序把新的页框赋给受影响的进程,并用原来页中的内容初始化新页框,重新向MMU发出执行该task的写操作。