CSDN|真棒!20 张图揭开内存管理的迷雾( 四 )

CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
四级目录TLB多级页表虽然解决了空间上的问题 , 但是虚拟地址到物理地址的转换就多了几道转换的工序 , 这显然就降低了这俩地址转换的速度 , 也就是带来了时间上的开销 。程序是有局部性的 , 即在一段时间内 , 整个程序的执行仅限于程序中的某一部分 。 相应地 , 执行所访问的存储空间也局限于某个内存区域 。CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
程序的局部性 我们就可以利用这一特性 , 把最常访问的几个页表项存储到访问速度更快的硬件 , 于是计算机科学家们 , 就在 CPU 芯片中 , 加入了一个专门存放程序最常访问的页表项的 Cache , 这个 Cache 就是 TLB(Translation Lookaside Buffer), 通常称为页表缓存、转址旁路缓存、快表等 。CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
地址转换 在 CPU 芯片里面 , 封装了内存管理单元(Memory Management Unit)芯片 , 它用来完成地址转换和 TLB 的访问与交互 。有了 TLB 后 , 那么 CPU 在寻址时 , 会先查 TLB , 如果没找到 , 才会继续查常规的页表 。TLB 的命中率其实是很高的 , 因为程序最常访问的页就那么几个 。段页式内存管理内存分段和内存分页并不是对立的 , 它们是可以组合起来在同一个系统中使用的 , 那么组合起来后 , 通常称为段页式内存管理 。CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
段页式地址空间 这样 , 地址结构就由段号、段内页号和页内位移三部分组成 。用于段页式地址变换的数据结构是每一个程序一张段表 , 每个段又建立一张页表 , 段表中的地址是页表的起始地址 , 而页表中的地址则为某页的物理页号 , 如图所示:CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
段页式管理中的段表、页表与内存的关系 段页式地址变换中要得到物理地址须经过三次内存访问:

  • 第一次访问段表 , 得到页表起始地址;
  • 第二次访问页表 , 得到物理页号;
  • 第三次将物理页号与页内位移组合 , 得到物理地址 。
可用软、硬件相结合的方法实现段页式地址变换 , 这样虽然增加了硬件成本和系统开销 , 但提高了内存的利用率 。Linux 内存管理那么 , Linux 操作系统采用了哪种方式来管理内存呢?在回答这个问题前 , 我们得先看看 Intel 处理器的发展历史 。早期 Intel 的处理器从 80286 开始使用的是段式内存管理 。 但是很快发现 , 光有段式内存管理而没有页式内存管理是不够的 , 这会使它的 X86 系列会失去市场的竞争力 。 因此 , 在不久以后的 80386 中就实现了对页式内存管理 。 也就是说 , 80386 除了完成并完善从 80286 开始的段式内存管理的同时还实现了页式内存管理 。但是这个 80386 的页式内存管理设计时 , 没有绕开段式内存管理 , 而是建立在段式内存管理的基础上 , 这就意味着 , 页式内存管理的作用是在由段式内存管理所映射而成的的地址上再加上一层地址映射 。由于此时段式内存管理映射而成的地址不再是“物理地址”了 , Intel 就称之为“线性地址”(也称虚拟地址) 。 于是 , 段式内存管理先将逻辑地址映射成线性地址 , 然后再由页式内存管理将线性地址映射成物理地址 。CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
Intel X86 逻辑地址解析过程 这里说明下逻辑地址和线性地址: