Page table, TLB, Cache简介(x86)


分页模型

以x86为例, intel的处理器的分页单元处理4kB的页, 32位的线性地址(虚拟地址)被分为3个域:
     -Directory, 目录, 最高10位
     -Table, 页表, 中间10位
     -Offset, 偏移, 低12位
     -正在使用的页目录的地址放在控制寄存器CR3中, directory字段决定页目录中的目录项, 而table则指向适当的页表项, 该页表项包含有所指向页框的物理地址,
       而offset则决定页框内的具体地址.
技术分享

     -地址位(31-12)。指向页目录项/页表项/页的基地址。
     -P(0)——存在位(Present)。表示该页表或页目录在、或不在物理存储器中。为0表示不再主存中。
      如果对某个虚拟地址执行转换是所需要的页目录项或者页表项中的P位为0,则分页单元就将该虚拟地址放入到控制寄存器CR2中那个,并产生缺页异常。
     -R/W(1)——读/写位(Read/Write)。指明页面是可读可写,还是只读。但是,R/W位对页的写保护只在处理器处于用户特权级时发挥作用。
       当处理器处于系统特权级时,R/W位被忽略,即总可以读、写或执行。
     -U/S(2)——用户/管理员位(User/Supervisor)。指明页面为用户层(特权层3)和管理员层的程序均能使用,仅还是能由管理员层(特权层0~2)的程序使用。
     -PWT(3)——页直写位(Page-level Write Through)。控制使用直写还是回写的高速缓存写入策略。
     -PCD(4)——页高速缓存禁止位(Page-level Cache Disable)。控制禁止还是使用高速缓存。
     -A(5)——访问位(Accessed)。当页表或页面进行读或写操作后,处理器将该位置位。处理器一旦置位该位不再清除它,只有软件可以得其复位。
     -D(6)——脏位。只用于页表项,当对所涉及的页面进行写操作时,页表项的D位被置位。类似访问位,只有软件可以复位。
     -PS(7)——只用于页目录项,如果为1,表示页目录项指向的是2MB/4MB的页框。
     -PAT(7)——(Pentium III processor) 选择一个PAT(page attribue table) 项,和PCD PWT 一起选择一个PAT表项,进而选择这个page的内存类型。
     -G(8)——(Pentium Pro开始引入)置1代表是一个全局页。可以防止常用页从TLB中刷新出去。只有在CR4中的page global entry(PGE)标志置位时才起作用。
     -AVL(D9~D11)——操作系统专用位(Available for system’s programmer use)。

     -分页单元首先将线性地址的高20位与TLB中所有的32项相比较。
             ?如果有一个地址匹配(即TLB命中),就直接得到了页面的基地址,只要加上线性地址的低12位偏移量,就计算出32位物理地址。
             ?如果没有地址匹配,处理器将进行2级查表过程。同时,从页表中读到的高20位线性地址被存入TLB中。

TLB
     -
TLB (translation look-aside buffer), 其实就是一块buffer, 缓存了内存中的页表项, 以加快虚拟地址到物理地址的转换速度.
       如果没有TLB, 则每次取数据都需要两次访存(查页表获得物理地址+取数据) .
技术分享


32位地址划分及cache
Memory address被划分为3部分: tag, index和block offset.
技术分享
     -Index对应cache row, tag对应内存地址的最高位, block offset表示需要的数据在某个cache row中的data block中的位置.
     -Index的长度=log2(cache rows)
     -Block offset的长度=log2(bytes_per_data_block), 4K为页的话就是12
     -Tag的长度=32 – index – block offset
     -以 32KB ,4 路组相联,行大小为 16Bytes 的 Cache 为例,正常工作时其对地址的划分如下所示:
     -Cache 以行大小(Line size)为单位分成若干个行。行 (Line) 是 Cache 的数据存储和管理单元。一个典型的 Cache 行结构为:
技术分享
     -其由 Tag 域、Status 域和数据域组成,
     -Tag 域存放该行数据对应地址的高位。CPU 在索引后,用相应地址与组内所有行的Tag 相比较,以之区分具体的行。
     -数据域能容纳的字节数是为行大小 (Line Size),其为 Cache 与内存之间数据交换的单位。
     -Status 域则为一些控制位信息(如Valid, Lock 以及Parity check位等等),不同的Cache 类型,不同的Cache实现Status域稍有不同。
     -以32KB 的4路组相联,行大小为 16Bytes的Cache为例的话,有 32*1024/(16 * 4)= 512 组
     -CPU 访问组相联 Cache 时,就先用index索引到组,然后组内同时匹配 Tag,进行路选。
技术分享

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。