zoukankan      html  css  js  c++  java
  • ASID 与 MIPS 中 TLB 相关

    ASID

    • 为了提高TLB的性能,将TLB分成Global和process-specific。global 是指常驻在tlb中不会被刷出的,例如内核空间的翻译,process-specific 是指每个进程独有的地址空间,当发生进程切换的时候,这部分tlb可以被刷出,为了支持process-specific的tlb,arm提出了ASID(Adress Space ID)的硬件解决方案,这样TLB就可以识别出这个 TLB 页表项是属于哪一个进程的。
    • 在 MIPS 中,有两个地方会出现ASID,每一个TLB表项会有一个ASID,标识这个表项是属于哪一个进程的,CP0_EntryHI 中的ASID是当前进程的ASID,所以进程对TLB的查询操作,即使VPN命中,但若该表项不是global且ASID与CP0_EntryHi的ASID不一致,则也视作TLB缺失 -- 这样就不用每次切换进程都要 flush 所有 tlb

    MIPS 中 TLB/MMU 相关寄存器

    TLB 关键字域

    • EntryHi 包含 VPN2 和 ASID 字段
      • VPN2 就是 TLB 表项对应的虚拟页表号,在 MIPS 设计中,一个 TLB 表项存储的是两个相邻虚拟页对应的物理页框号,所以 VPN2 只有 21 位(除去页内偏移12位和第13位)
      • ASID 字段,是当前进程的ASID,在对 TLB 访问查询中起到验证的作用(具体见 ASID 部分)。
    • EntryLo0-1
      • PFN 对应的物理页框号
      • D(dirty) 标志位,置位时允许写入;0 不允许写入,若写入则发生异常
      • V(valid) 有效位
      • G(global) 表明该 TLB 表项是全局的还是属于特定进程的,若是全局的,则对该 TLB 表项的读取都会无视 ASID 是否匹配
    • EntryHi 与 EntryLo 一道负责 TLB 的写入与读取操作,tlbr 将读到的 TLB 表项写入 EntryHi(注意这一步会覆盖原本的 ASID,执行之后需要恢复)与 EntryLo 之中。
    • PageMask
      • 用于支持更大的页,PageMask 寄存器值为 1 的位,在执行 TLB 表项匹配时被忽略(即 PageMask 寄存器值为 1 的位被视作页内偏移位),如: PageMask 低 12 位为 1,则表明页大小为 4KB。
      • 另外,在 MIPS 体系中,页的大小在 4KB 和 16MB 之间以四倍递增。

    TLB 选择寄存器

    • index
      • 值为 0 到 表项总数 - 1 之间的一个数,用于指出 tlbr、tlbwi 读写的是第几个 TLB 表项。
    • Random
      • 保存 TLB 的一个索引,CPU 每执行一条指令就向下递减计数一次,该值充当 tlbwr 的 TLB 索引,在需要更新 TLB 时,帮助实现随机替换策略。

    页表存取辅助寄存器

    • Context 和 XContext

      • 辅助处理 TLB 重填异常,其中 XContext 是 MIPS64 位中增加的
      • 32位的 Context 数据域为:
      31 - 23 22 - 4 3 - 0
      PTEBase BADVPN2 0
      • PTEBase 存储页表空间的起始地址(因为起始地址是 8M 对齐)
      • BADVPN2 是 BADAddr 的 VPN2 域,BADAddr 是引起重填异常的虚拟地址
      • 实际上 32 位中一个页表项只有 64 位大(VPN2 下),但是 MIPS 为了与 64 位页表兼容,预留成 2*64 位大
      • 因为 PTEBase 是页表空间的起始地址,BADVPN2 标明该 BADAddr 所对应的是第 BADVNP2 个页表项,故 BADVPN << 4 就是 BADAddr 对应的页表项相对于页表空间起始地址的偏移,所以当发生重填异常的时候,Context 存储的就是对应页表项的虚拟地址,即需要加载到 EntryLo0-1中的数据项的地址。所以依靠 Context 的辅助,能够极大程度的简化重填异常处理的过程。

    TLB 重填异常处理

    mfc0 k1, C0_CONTEXT
    lw 	 k0, 0(k1)
    lw   k1, 8(k1)
    mtc0 k0, C0_ENTRYLO0
    mtc0 k1, C0_ENTRYLO1
    ehb
    tlbwr
    eret
    
    • ehb 汇编指令用于保证 ehb 之前对协处理器 0 的操作都会在执行该条指令之后指令时已完成

    参考资料:See MIPS Run Linux (2nd edition)

  • 相关阅读:
    java 深入理解jvm内存模型 jvm学习笔记
    java实体 和 xml相互转换
    clickhouse 离线/在线 安装和java通过jdbc链接
    clickhouse安装 Requires: libstdc++.so.6(GLIBCXX_3.4.19)(64bit)
    maven pom.xml详解
    elasticsearch 简单demo RestHighLevelClient LowLeveClient
    从一段时间段中获取所有日期
    hadoop 输入路径用正则表达式被默认处理为多个参数的问题
    对象变化影响map中的数据
    小技巧积累
  • 原文地址:https://www.cnblogs.com/Melles/p/10714224.html
Copyright © 2011-2022 走看看