MIPS_TLB

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值