Memory

Posted by Suibin Sun on December 04, 2023 · 1 min read

1. Memory

1.1. 虚拟内存

1.1.1. 映射

1.1.1.1. 内核与MMU的交互

  • 创建页表之后,设置页表基地址寄存器的值;
  • 对于支持分段的架构(x86),需要创建、初始化分段描述符表,将分段描述符表的地址加载到对应寄存器中;
  • 刷新TLB:进程上下文切换之后,需要刷新TLB,向MMU发送TLB shootdown/TLB invalidate请求给MMU;
  • 设置权限位:设置页表项的读写执行权限;
  • 处理page fault:内核需要提供处理page fault的逻辑;
  • 启用、禁用MMU:启动阶段、进入中断处理程序之前;
  • 调整多级页表结构:修改页表项或添加新的页表;
  • 支持NUMA

1.1.1.2. ASID

  • 是什么:标识每个进程的一个标签,在TLB项中也保存这个标识用于区分不同的进程;
  • 作用:有了ASID之后,可以不用在每次切换进程上下文的时候,刷新所有的TLB表项。

1.2. 物理内存

1.2.1. 申请

1.2.2. 释放

1.2.3. 回收

1.2.3.1. swap机制

  • 因为文件页有自己的后端,可以直接回收,而不需额外的内容保存操作,比较简单快速,因此swap机制仅针对匿名页,将暂时不需要的匿名页回收到磁盘

1.2.3.2. 反向映射