VPN : 虚地址的高位(即虚页地址)。在双入口TLB内被称作VPN2 PageMask : 控制使用虚地址的多少位来跟VPN进行比较;并决定多少位被通过后加入实地址;最大达16MB的内存
ASID : Ø 标记这个TLB过程属于某一个特定进程,因此除非CPU的当前 ASID与之相吻合,否则匹配是不会成功的。 Ø "G"这一位如果被置起为1,则关闭ASID的匹配, Ø ASID位在早期CPU中为6位长度,而在近期的CPU中则为8位。
TLB 输出: 给出物理页号和标志位。 Ø PFN:物理页号 Ø C: 缓存控制 Ø D: 写控制位(为1则允许数据写入相应的页) Ø V: Valid位,如果是0,则相应的入口是不可使用
|
TLB HIT : 1)CPU 产生一个程序地址 : i) 无论是取指令,还是装入和写回数据; ii) 低12位被分离开来,剩下的处于EntryHi的VPN和ASID相拼作为TLB的键值 iii) TLB入口中的PageMask位与C位对这个值有修改效果。 2)TLB 进行键值匹配 : 匹配成功的入口被选出。PFN被附加在程序地址的低位之前以产生一个完整的物理地址。 3) 地址有效吗? V位和D位被参考: 如果地址为无效或者正试图写一个D位为0的页,CPU产生Trap。 4) 是否被缓存? 如果C位被置起,那么Cache取数;否则按策略取数
TLB MISS: 1) 判断是否存在一个正确的转译;如果不存在,这个陷入会被派发到用于处理地址错误的程序中去。 2) 假如存在一个正确的转译,那么创建一个用于实现转译的TLB入口。 3)假如TLB已经装满(在运行中的系统中它基本上也总是满的),软件要选择一个可以丢弃的入口。 4)软件把新的入口内容填入TLB。
|
tlb refill exception(0x80000000): (1) get badvaddr,pgd (2) pte table ptr = badvaddr>>22 < 2 + pgd , (3) get context,offset = context >> 1 & 0xff8 (bit 21-13 + three zero), (4) load offset(pte table ptr) and offset+4(pte table ptr), *(5) right shift 6 bits,write to entrylo[01], (6) tlbwr tlb modified exception(handle_mod): (1) load pte, *(2) if _PAGE_WRITE set,set ACCESSED | MODIFIED | VALID | DIRTY, reload tlb,tlbwi else DO_FAULT(1) tlb load exception(handle_tlbl): (1) load pte (2) if _PAGE_PRESENT && _PAGE_READ, set ACCESSED | VALID else DO_FAULT(0) tlb store exception(handle_tlbs): (1) load pte *(2) if _PAGE_PRESENT && _PAGE_WRITE,set ACCESSED | MODIFIED | VALID | DIRTY else DO_FAULT(1)
|
TLB Refill: 代码注释 lui k1,%hi(pgd_current) //当前进程的PGD表地址高位 mfc0 k0,C0_BADVADDR //取TLB MISS vaddr地址 lw k1,%lo(pgd_current)(K1) //(页表地址高位|低位) -> k1 srl k0,K0,22 //k0 右移22 bit;即pgd = 高10bit sll k0,K0,2 //k0 左移2bit;因为每项占4个字节,所以pgd*4 addu k1,K1,K0 //k1=pgd_current+pgd_index*4; mfc0 k0,C0_Context //context -> k0 lw k1,0(k1) //k1<- pgd_current[pgd_index];即PTE表入口 srl k0,k0,1 //k0右移1bit ,因为一次映射2页,去掉1bit andi k0,k0,0xff8 //k0取9bit ;后面还有3bit,因为每项8BYTE addu k1,k1,k0 //pte_base + pte_index lw k0,0(k1) //k0<- pte_base(pte_index): entry0 lw k1,sizeof(pte_t)(k1) // k1<- pte_base(pte_index) +4: entry1 srl k0,k0,6 // k0右移6bit; 后6bit是软件位,不填到TLB里 mtc0 k0,C0_ENTRYLO0 srl k1,k1,6 mtc0 k1,C0_ENTRYLO1 sll zero,zero,0x3 //ehb的gcc实现 Tlbwr //写入TLB eret |
MIPS_TLB
最新推荐文章于 2021-09-14 11:24:54 发布