合肥建设厅官方网站,百度站长,自己做网站百度会收录,建筑工程水平防护网本文以Cortex-A53处理器为例#xff0c;通过访问 处理器中的内部存储单元#xff08;tag RAM和dirty RAM#xff09;#xff0c;来读取cache line 中的MOESI信息。 Cortex-A53提供了一种通过读取一些系统寄存器#xff0c;来访问Cache 和 TLB使用的一些内部存储单元的机制…本文以Cortex-A53处理器为例通过访问 处理器中的内部存储单元tag RAM和dirty RAM来读取cache line 中的MOESI信息。 Cortex-A53提供了一种通过读取一些系统寄存器来访问Cache 和 TLB使用的一些内部存储单元的机制。这个功能可以探查出当缓存中的数据与主存中的数据不一致时存在的问题。 此外A64模式和A32模式的读取方式不同 当处理器处于A64模式时先通过一些只写write-only寄存器来选择具体的cache line和内存地址然后通过只读寄存器来读取具体的tag信息。下图为相关寄存器以及相关操作指令需要注意的是这些操作只在EL3时可用如果在其他模式下使用这些指令将会进入Undefined Instruction 异常。 当处理器处于A32模式下时先通过一些只写write-onlyCP15寄存器来选择具体的cache line和内存地址然后通过只读CP15寄存器来读取具体的tag信息。下图为相关寄存器以及相关操作指令需要注意的是这些操作只在EL3时可用如果在其他模式下使用这些CP15指令将会进入Undefined Instruction 异常。 接下来本文以Cortex-A53的Data cache为例读取其某个cache line的tag信息其具体的步骤很简单分为两步
写入Data Cache Tag Read Operation Register写入的内容为具体的Set和way信息通过way index和set index来定位到想要读取的cache line。读取相应的 Data Register 0 和 Data Register 1寄存器通过对Data Register寄存器里面的数据进行解码来获取tag 信息。 其他信息比如Data cache 的data信息Instruction Cache的data或者tag信息以及TLB的data信息都可以用这种方式读取得到。
Step1将Set/way信息写入Data Cache Tag Read Operation Register
首先我们需要从一个虚拟地址VA中解析出Set index信息。 下图为Cortex-A57的4-way组相连的32KB大小的data cache结构其cache line大小也为64 bytes从图中可知一个VA可以被分成几个部分TagSet indexword index以及byte index。其中Set index VA[13:6]。 在另一个实例中32KB大小的4-way组相连data cachecache line大小为32 bytes其Set index VA[12:5] Cortex-A53的Data cache为4-way 组相连结构。假设其为32KB一个cache line的大小为64 bytes我们就可以求出该data cache中有 32 KB / 64 B / 4 2^7 128个set组也就是说至少需要7个bit才能完整解析出具体的set index。如下图所示可以通过公式 S log2(Data cache size / 4). 来计算出Set index的范围Set index VA[12:6]。 由于是4-way 组相连结构cache line 可以存在与任意一个way中所以我们的cache way可能为01,23中任意一个数字。 求得了set和way的index后需要对其进行编码然后写入到Data Cache Tag Read Operation Register寄存器中。其编码规则如下图所示只需将Set和way的值写入对应的bit中即可其中Rd[5:3]为cahche double word数据的偏移量由于本次示例是读取tag信息所以Rd[5:3]为0即可。 所以我们要写入Data Cache Tag Read Operation Register的Rd的值可以通过以下代码获取
unsigned int get_Rd_data(int * VA, way_num)
{unsigned int set_way_index VA | 0x1FC0; //get way index, VA[12:6]set_way_index | way_num 30; //way_num could be 0,1,2,3 return set_way_index;
}Rd中除了Set和way信息其他值均为00x1FC0为VA[12:6]全为1的情况 然后我们使用CP15寄存器将Rd的值写入假设Rd为R0
MCR p15, 3, r0, c15, c2, 0 ; r0 get_Rd_data(VA,way_num)Step2读取Data Register 1和Data Register 0数据并解码
将Set/way信息写入Data Cache Tag Read Operation Register 后相当于选择了想要操作的cache line接下来我们将读取Data Register 1和Data Register 0的数据来获取该cache line里的tag信息除了tag信息外我们还可以从Data Register 1和Data Register 0两个寄存器中获取
MOESI 状态信息outer内存属性valid 信息 可获得的信息具体见下图 需要注意的是如果是想获取MOESI状态信息则需要两个寄存器配合使用即读取Data Register 0 [1:0]以及Data Register 1 [30:29] Data Register 0 [1:0]里的为来自Dirty RAM的部分状态信息Data Register 1 [30:29]里的为来自tag RAM的部分MOESI信息 其具体的组合见下图 比如读取到的Data Register 0 [1:0]为1以及Data Register 1 [30:29]也为1根据上图的组合关系可知当前cache line的MOESI状态为 SharedDirtyO。
示例代码如下
; step 1: write set index and way num into Data Cache Tag Read Operation Register
MCR p15, 3, r0, c15, c2, 0 ; r0 get_Rd_data(VA,way_num)
; step 2: read Data Register 1 and Data Register 0
MCR p15, 3, r1, c15, c0, 0 ;r1 Data Register 0
MCR p15, 3, r2, c15, c0, 1 ;r2 Data Register 1 参考文章 DDI0500E_cortex_a53_r0p3_trm.pdf