地址翻译概述

来源:互联网 发布:gxh-305分析仪的数据 编辑:程序博客网 时间:2024/05/16 18:44

本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/9034525

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


之前学习体系结构和操作系统课程时没有系统地理解程序的执行过程,最近在项目中深有体会,在这做一下梳理:

冯诺依曼架构的计算机秉承指令与数据均保存在存储设备上的宗旨,运算器将指令从存储器上拿到运算器自身的部件中执行。CPU经过取指令、执行,取指令、执行的循环过程,完成计算任务。

CPU是基于硬件的物理地址进行寻址的(即CPU可见的物理地址空间),从原理上来说,某一时刻CPU确定一条物理地址,经地址总线去存储器相应位置取指令或数据,再由数据总线传回给CPU的指令缓冲器,完成一次取指并执行。CS与IP两个重要寄存器,负责系统不停地执行指令,这里是详细的原理说明。

当前主流CPU都启用了虚拟地址功能,通过分页机制使每个进程都有自己独立的虚拟地址空间,从而有效地利用有限的物理内存资源。在启用了虚拟地址后,CPU内部都增加了硬件MMU,负责将一条虚拟地址转化为一条CPU可寻址的物理地址,最终到存储器中取得指令或数据。有关物理地址、虚拟地址、线性地址、逻辑地址的关系,见这里。

进程在创建时,操作系统负责建立进程的一整套页表结构(页表机制参考IA-32手册)。当进程被调度执行时,操作系统负责将进程页表的基地址填到CR3寄存器中(此处谨以x86架构CPU为例),之后CPU的硬件MMU利用操作系统已经建立好的页表结构逐级索引得到最终的物理地址,CPU到该物理地址单元读取指令或数据,加载到CPU中执行。

在当前体系结构启用了缓存优化技术的情况下,MMU硬件按照TLB -> cache -> DRAM的顺序寻址物理地址。TLB是CPU的MMU硬件上的一块页表项(PTE,Page Table Entry,下同)的小缓存,一个TLB行保存着一条虚拟地址及其对应的页表项,由于它完全在CPU硬件内部,地址翻译速度大大加快。TLB hit则直接返回物理地址,CPU去该地址处取指令或数据;发生TLB miss,即TLB中没有缓存虚拟地址对应的页表项,MMU将通过地址总线查询cache(cache可以理解为主存的一个子集,用于缓存常用的物理页,现多实现为多级cache),cache返回一个页表项给MMU(每个页表项均是一条物理地址,对于多级页表的OS,每一级页表项在MMU与cache/主存之间来回传送,直到最后一级页表项返回给MMU,MMU根据该PTE及偏移,构造最终物理地址),CPU根据最终的物理地址去cache/主存单元中取得指令或数据。

关于“为何有了cache还要增加TLB这个部件?他们不都是缓存的页表项PTE吗?”这个问题,其实就是cache与TLB的区别了,首先cache是主存的一个子集,由于页表项是常驻主存的,所以常用的页表项会被缓存到cache中,加速地址翻译。至于是使用虚拟地址还是物理地址来访cache,大多数系统采用物理地址进行访问,达到访问cache就像访问主存一样。但是要注意,这里的页表项可能是多级页表结构中每一级页表项,在地址翻译的过程中,cache和TLB只是缓存了这些每一级的PTE,使MMU在访问每一级页表时加速地址翻译。由于TLB是MMU硬件电路的一部分,所以访问速度很快。TLB只是一个针对PTE的cache,cache用途更广泛,可以缓存主存中的任意单元。这里有一篇cache、TLB的简要说明。