现在的位置: 首页 > 综合 > 正文

<深入浅出>mips tlb asid的原理与场景

2013年03月27日 ⁄ 综合 ⁄ 共 1113字 ⁄ 字号 评论关闭

 1) 关于mips asid的理解
进程切换时,switch_mm:
if ((cpu_context(cpu, next) ^ asid_cache(cpu)) & ASID_VERSION_MASK )
  get_new_mmu_context(next, cpu);           
 else
  netl_active_asids[cpu] = cpu_context(cpu, next);

条件:
A,B进程属于组group_1(内含256个进程)  A.asid = 0x101   B.asid = 0x102
X进程属于组group_2 (内含256个进程) X.asid = 0x306
CPU当前运行进程为B,cpu.asid = 0x102
 
情景1:
B ---> A
条件判断为
if((0x101^0x102)& 0xffffff00 ) 为0(是同一个组),因此不进行下一步操作,直接切换mm,cpu的aisd也不变

情景2:
A---> X
条件判断为
if(0x306^0x102) &0xffffff00) 不为0(不是同一个组),因此执行get_new_mmu_context(next, cpu);

      unsigned long asid = asid_cache(cpu);

 if (! ((asid += ASID_INC) & ASID_MASK) ) {
  if (cpu_has_vtag_icache)
   flush_icache_all();
  local_flush_tlb_all(); /* start new asid cycle */
  if (!asid)  /* fix version if needed */
   asid = ASID_FIRST_VERSION;
 }
 cpu_context(cpu, mm) = asid_cache(cpu) = asid;

1)首先取出当前cpu的asid号
asid = 0x102
2)接着累加
asid = 0x103
3)再检查是否产生溢出
asid & 0xff 不为0,没有溢出
4)因此进程X的asid被修改为0x103,cpu的asid也被修改为0x103
所以这里可以看出,cpu的asid,一定是当前运行进程组里,asid最大的那个值。

若第3步产生了溢出,那么使本核内tlb都置invalid,即刷新。

如果希望将某个core内的tlb共享,则需要对asid做相应的软件处理。由于一个core内的

4个threads都共享了tlb,那么cpu4可能访问到原cpu5的tlb条目,由此可能造成冲突,为了

不让4个线程的asid重叠,那么取8位entryhi asid的高2位,写入本threads号(0-3),剩下的

编号,再通过自增1生成(asid++),这样就避免了重叠。

抱歉!评论已关闭.