对 TLB 的操作是通过访问 CP15 的 C8 和 C10 寄存器来完成的,写 CP15 的 C8/C10 寄存器的指令格式如下所示:
mcr p15, 0, , , crm,
mcr p15, 0, , , crm,
4.6.1 使 TLB 内容 无效
使 TLB 中的内容无效是通过写 CP15 的寄存器 C8 来实现的,指令如表 4-9 所示。
表 4-9 使 TLB 内容无效操作指令
指 令 |
|
|
| 含 义 |
mcr p15, 0, rd, c8, c7, 0 | 0b000 | 0b0111 | 0 | 使整个统一 cache 或整个数据和指令 cache 无效 |
mcr p15, 0, rd, c8, c7, 1 | 0b001 | 0b0111 | 虚拟地址 | 使统一 cache 中的单个地址变换条目无效 |
mcr p15, 0, rd, c8, c5, 0 | 0b000 | 0b0101 | 0 | 使整个指令 cache 无效 |
mcr p15, 0, rd, c8, c5, 1 | 0b001 | 0b0101 | 虚拟地址 | 使指令 cache 中的单个地址变换条目无效 |
mcr p15, 0, rd, c8, c6, 0 | 0b000 | 0b0110 | 0 | 使整个数据 cache 无效 |
mcr p15, 0, rd, c8, c6, 1 | 0b001 | 0b0110 | 虚拟地址 | 使数据 cache 中的单个地址变换条目无效 |
4.6.2 锁 定 TLB 内容
锁定 TLB 是通过写 CP15 的寄存器 C10 来实现的。
锁定 TLB 中 N 条地址变换条目的操作步骤说明如下:
1 )确保在整个锁定过程中不会产生异常中断, 可以通过禁止中断等方法实现;
2 )如果锁定的是指令 TLB 或者统一的 TLB ,将 base=N 、 victim=N 、 P=0 写入 C10 ;
3 )使整个将要锁定的 TLB 无效;
4 )如果想要锁定的是指令 TLB ,确保与锁定过程所涉及的指令相关的 地址变换条目已经加载到指令 TLB 中;如果想要锁定的是数据 TLB ,确保与锁定过程所涉及的数据相关的地址变换条目已经加载到指令 TLB 中;如果系统使用的是统一的数据 TLB 和指令 TLB ,上述两条都要保证;
5 )对于 I=0 到 N-1 ,重复执行下面操作:
将 base=i 、 victim=i 、 P=1 写入寄存器 C10 ,将每一条想要锁定到快表中的地址变换条目读取到快表中。对于数据 TLB 和统一 TLB 可以使用 ldr 指令读取一个涉及该地址变换条目的数 据,将该地址变换条目读取到 TLB 中。对于指令 TLB ,通过操作寄存器 C7 ,将相应的地址变换条目读取到指令 TLB 中;
6 )将 base=N 、 victim=N 、 P=0 写入寄存器 C10 。
4.6.3 解 除 TLB 中被锁定的地址变换条目
解除 TLB 中被锁定的地址变换条目,可以使用以下操作步骤:
1 )通过操作寄存器 C8 ,使无效 TLB 中被锁定的地址变换条目;
2 )将 base=0 、 victim=0 、 P=0 写入 C10 寄存器。