物理内存

地址编码从0开始, 一个字节地址为1, 2G 内存的物理地址空间就是0到 2G

实模式的特点是所有访存指令访问的都是物理内存地址。

AT&T 风格的汇编, src 在左, dest 在右, intel 风格相反

局部性原理

程序的数据访问会表现出明显的倾向性。这种倾向性,我们就称之为局部性原理 (Principle of locality)。

  • 时间局部性: 被访问过一次的内存位置很可能在不远的将来会被再次访问
  • 空间局部性: 如果一个内存位置被引用过,那么它邻近的位置在不远的将来也有很大概率会被访问

推论: 无论一个进程占用的内存资源有多大,在任一时刻,它需要的物理内存都是很少的

为了让程序员编程方便, 每个进程都独享 128T 的虚拟内存空间,并且每个进程的地址空间都是相互隔离的

  • 任何虚拟内存最终都要映射到物理内存,但虚拟内存的大小又远超真实的物理内存的大小

虚拟内存与程序局部性原理

虚拟内存和物理内存的映射 (Mapping) 机制

  • 进程启动之后,这些空间并不是全部都能使用的。开发者必须要使用 malloc 等分配内存的接口才能将内存从待分配状态变成已分配状态
  • 在虚拟内存中连续的页面,在物理内存中不必是连续的
  • 这种映射关系是操作系统通过页表来自动维护的

image.png

页表的结构

映射的过程,是由 CPU 的内存管理单元 (Memory Management Unit, MMU) 自动完成的,但它依赖操作系统设置的页表。

页表的本质是页表项 (Page Table Entry, PTE) 的数组,虚拟空间中的每一个页在页表中都有一个 PTE 与之对应,PTE 中会记录这个虚拟内存页所对应的实际物理页的起始地址

  • PTE 4B * 1024 = 页 4k
  • 1024 * 页 4k = 4m

image.png

页目录表中的每一项叫做页目录项 (Page Directory Entry, PDE),每个 PDE 都对应一个页表,它记录了页表开始处的物理地址,这就是多级页表结构

image.png

一个 CPU 怎么找到真实地址?

image.png

对于 64 位机器是不是有点不同呢?在 64 位的机器上,使用了 48 位的虚拟地址,所以它需要使用 4 级页表。它的结构与 32 位的 3 级页表是相似的,只是多了一级页目录,定位的过程也从 32 位的 4 步变成了 5 步。

页面的换入换出

那对于那些没有被经常使用到的内存,我们可以把它换出到主存之外,比如硬盘上的 swap 区域。新的虚拟内存页可以被映射到刚腾出来的这个物理页。