Intel386微处理器分页硬件旨在支持按需分页的虚拟内存系统。但是,如果要求处理器为每个内存引用访问两级的表,则性能将大幅降低。为了解决这个问题,Intel386SX微处理器保存了最近访问的页面的缓存,这个缓存称为翻译后备缓冲区(TLB)。TLB是一个四路集合关联32条目页表缓存。它自动将最常用的页表条目保存在处理器中。32条TLB加上4K页面大小,导致内存地址覆盖128K字节。对于许多常见的多任务系统,TLB的命中率将超过98%。这意味着处理器访问两级页面结构中只有少于2%的内容会引用内存。
80386刷新TLB只能通过重装CR3!
386的TLB结构:
![662bcde2ccd3def927d3c62811255e47.png](https://i-blog.csdnimg.cn/blog_migrate/7e5e6f9a22c297272691bc8efcde9279.jpeg)
![6224b00957d46baf00dc135a5853f722.png](https://i-blog.csdnimg.cn/blog_migrate/c01f34e7cedb1f32ec1e3bc8e89cde28.jpeg)
386的TLB一共4组,每组8个条目,一个条目由TAG和DATA组成,每个条目可以覆盖4K内存,4*8*4K=128KB,因此最大
覆盖的内存128KB。
TAG由V、D、U、W和线性地址的高20位组成共24位,DATA由物理地址的20位组成。(按这个计算一共是44位,这不符合对齐的原则,里面肯定有隐藏位,这只是猜测。)
80386 TLB测试:
- 写条目到 TLB
- 执行TLB查找
80386提供2个测试寄存器:
- TR6 is the ‘‘test command register’’
- TR7 is the ‘‘test data register’’
![6224b00957d46baf00dc135a5853f722.png](https://i-blog.csdnimg.cn/blog_migrate/c01f34e7cedb1f32ec1e3bc8e89cde28.jpeg)
Intel 1986版 80386 programmer reference manual :
![4a169fa792bae25dc083812310821314.png](https://i-blog.csdnimg.cn/blog_migrate/8224bf07cf849bb78023e68a8ca1b04b.jpeg)
![d9c9d3c7d7e6e3fb154db33d7e1861d8.png](https://i-blog.csdnimg.cn/blog_migrate/56ddb0487d963311261c2d1bf70e7be3.jpeg)
DUW这3个位和他们的补位的组合在这一版手册上 11是写成undefined
这是1990版,这里修改过来了。
![2e700b7007d3c88b5f7a1b72cbd0b91e.png](https://i-blog.csdnimg.cn/blog_migrate/b6a952315f6b47a970a075e6d80fa7d1.jpeg)
分页单元硬件从分段单元接收32位线性地址。线性地址的高20位与TLB中的所有32个条目进行比较,以确定是否匹配。如果存在匹配(即TLB命中),则计算24位物理地址并将其放在地址总线上。
如果页表条目不在TLB中,则386处理器将读取相应的页目录条目。如果页目录条目上的P=1,表明页表在内存中,则l386处理器将读取相应的页表条目并设置访问位。如果页表条目上的 P=1表明页面在内存中,则 386处理器将根据需要更新"访问"和"脏"位并获取操作数。从页表中读取的线性地址的高20位将存储在TLB中,以供以后访问。如果页目录条目或页表条目的p=0,那么处理器将生成页错误异常14。(Intel386TM SX手册)
TI 486 手册:
![78b3b69811651f7f87abd71fe96702b8.png](https://i-blog.csdnimg.cn/blog_migrate/22111942153eae45f400a1fdf3701863.jpeg)
AMD 手册:
![e9ea4df0fb2d827380aa54b50a90eb5a.png](https://i-blog.csdnimg.cn/blog_migrate/cd23350e2ae809b59a40e06cd588fd64.jpeg)
通过写入和读取(TLB查找)测试寄存器TR6和TR7来检查TLB。要为测试设置TLB条目,必须首先使用物理地址、
PL = 1和REP的值加载TR7。接下来,必须使用适当的线性地址和属性位写入TR6并清除命令C位。要执行TLB查找(即读取TLB条目),使用相应的线性地址加载TR6并设置C.然后读取两个测试寄存器TR6和TR7。PL位指示是否发生命中(PL = 1)或未命中(PL = 0)。在第一种情况下,测试寄存器值反映相关TLB条目的内容。另一方面,在未命中时,它们包含无效值。
查找TLB,TR7中PL=0时,TR7的高20位一般返回0xFFFFF。
;写测试寄存器的2步
;
; TR7 物理地址0x20000,PL = 1 REP = 0
;
mov eax,0x20010
mov tr7,eax
;
;TR6 线性地址0x10000,V=D=U=W=1 C=O
;
mov eax,0x10d40
mov tr6,eax
;读测试寄存器
;
;tr6 线性地址0x10000,V=1 DUW=D#U#W#(complement)=11B C=1
;
mov eax,0x10fe1
mov tr6,eax
mov eax,tr7
mov ebx,tr6