分页模型
以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,进行路选。