本文以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-only)cp15寄存器来选择具体的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可以被分成几个部分:tag,set index,word index以及byte index。其中set index = va[13:6]。
在另一个实例中,32kb大小的4-way组相连data cache,cache 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可能为0,1,2,3中任意一个数字。
求得了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信息,其他值均为0,0x1fc0为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状态为 shareddirty(o)。
示例代码如下:
; step 1: write set index and way num into data cache tag read operation registermcr p15, 3, r0, c15, c2, 0 ; r0 = get_rd_data(va,way_num); step 2: read data register 1 and data register 0mcr p15, 3, r1, c15, c0, 0 ;r1 = data register 0 mcr p15, 3, r2, c15, c0, 1 ;r2 = data register 1
华星光电发布全球首款Mini背光的MLED星曜屏
5G-A URLLC汽车柔性产线介绍
特斯拉半年内国内出现多起重大事故,到底制动问题还是误操作
这款iPhone黑科技手机壳不仅功能多,设计更巧妙
台积电2nm工艺取得重大突破,2023下半年风险试产良率可达90%
请问ARMv8如何读取cache line中的MOESI信息呢?
中国移动正在从四方面推动边缘计算产业的发展
史陶比尔四轴Scara TS60机器人,实现太阳能电池高效率生产
十个月1.2万亿的芯片市场应该留在中国,致力打造中国芯的人最美
基于磁敏传感技术的位移测量编码与识别[图]
Fidus Sidewinder-100集成PCIe NVMe 控制系统,有效应对FPGA硬件设计
大唐移动的5G网络具体测试成果总结分析
公牛智立方USB插座WIFI版评测 智能用电不可少的利器
Y电容布局和接地阻抗对滤波器的共模插损影响到底有多大?
荣耀9发布会倒计时:华为荣耀9即将发布,双玻璃+金属中框设计+配置升级,华为荣耀8降价400支持
疑似小米6包装盒曝光,配置参数全揭秘!
一种以动态硫代氨酯键作为动态可逆交联点的共价可适网络
加密货币市场如何才能扩展更多的用户
中兴通讯Cloud Native SDM统一用户安全认证方案详细介绍
基于Sn掺杂CuO纳米结构的乙醇气体传感器实现车内实时酒驾检测