请问ARMv8如何读取cache line中的MOESI信息呢_第1页
请问ARMv8如何读取cache line中的MOESI信息呢_第2页
请问ARMv8如何读取cache line中的MOESI信息呢_第3页
请问ARMv8如何读取cache line中的MOESI信息呢_第4页
请问ARMv8如何读取cache line中的MOESI信息呢_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页请问ARMv8如何读取cacheline中的MOESI信息呢?

本文以Cortex-A53(处理器)为例,通过访问处理器中的内部存储单元(tag(RAM)和dirtyRAM),来读取cacheline中的MOESI信息。

Cortex-A53提供了一种通过读取一些系统(寄存器),来访问Cache和TLB使用的一些内部存储单元的机制。这个功能可以探查出当缓存中的数据与主存中的数据不一致时存在的问题。

此外,A64模式和A32模式的读取方式不同:

当处理器处于A64模式时,先通过一些只写(wri(te)-only)寄存器来选择具体的cacheline和内存地址,然后通过只读寄存器来读取具体的tag信息。下图为相关寄存器以及相关操作指令,需要注意的是,这些操作只在EL3时可用,如果在其他模式下使用这些指令,将会进入UndefinedInstruc(ti)on异常。

当处理器处于A32模式下时,先通过一些只写(write-only)CP15寄存器来选择具体的cacheline和内存地址,然后通过只读CP15寄存器来读取具体的tag信息。下图为相关寄存器以及相关操作指令,需要注意的是,这些操作只在EL3时可用,如果在其他模式下使用这些CP15指令,将会进入UndefinedInstruction异常。

接下来,本文以Cortex-A53的Datacache为例,读取其某个cacheline的tag信息,其具体的步骤很简单,分为两步:

写入DataCacheTagRe(ad)OperationRegister,写入的内容为具体的Set和way信息,通过wayindex和setindex来定位到想要读取的cacheline。读取相应的DataRegister0和DataRegister1寄存器,通过对DataRegister寄存器里面的数据进行解码,来获取tag信息。其他信息,比如Datacache的data信息,InstructionCache的data或者tag信息,以及TLB的data信息,都可以用这种方式读取得到。Step1:将Set/way信息写入DataCacheTagReadOperationRegister

首先,我们需要从一个虚拟地址(VA)中解析出Setindex信息。

下图为C(or)tex-A57的4-way组相连的32KB大小的datacache结构,其cacheline大小也为64bytes,从图中可知,一个VA可以被分成几个部分:Tag,Setindex,wordindex以及byteindex。其中Setindex=VA[13:6]。

在另一个实例中,32KB大小的4-way组相连datacache,cacheline大小为32bytes,其Setindex=VA[12:5]:

Cortex-A53的Datacache为4-way组相连结构。假设其为32KB,一个cacheline的大小为64bytes,我们就可以求出该datacache中有32KB/64B/4=2^7=128个set(组),也就是说至少需要7个bit才能完整解析出具体的setindex。如下图所示,可以通过公式:

S=log2(Datacachesize/4).来计算出Setindex的范围:Setindex=VA[12:6]。

由于是4-way组相连结构,cacheline可以存在与任意一个way中,所以我们的cacheway可能为0,1,2,3中任意一个数字。

求得了set和way的index后,需要对其进行编码,然后写入到DataCacheTagReadOperationRegister寄存器中。其编码规则如下图所示,只需将Set和way的值写入对应的bit中即可,其中Rd[5:3]为cahchedoubleword数据的偏移量,由于本次示例是读取tag信息,所以Rd[5:3]为0即可。

所以我们要写入DataCacheTagReadOperationRegister的Rd的值可以通过以下代码获取:

unsignedintget_Rd_data(int*VA,way_num){unsignedintset_way_index=VA|0x1FC0;//getwayindex,VA[12:6]set_way_index|=way_numRd中除了Set和way信息,其他值均为0,0x1FC0为VA[12:6]全为1的情况:

然后我们使用CP15寄存器将Rd的值写入,假设Rd为R0:

MCRp15,3,r0,c15,c2,0;r0=get_Rd_data(VA,way_num)Step2:读取DataRegister1和DataRegister0数据并解码

将Set/way信息写入DataCacheTagReadOperationRegister后,相当于选择了想要操作的cacheline,接下来我们将读取DataRegister1和DataRegister0的数据来获取该cacheline里的tag信息,除了tag信息外,我们还可以从DataRegister1和DataRegister0两个寄存器中获取:

MOESI状态信息outer内存属性valid信息可获得的信息具体见下图:

需要注意的是,如果是想获取MOESI状态信息,则需要两个寄存器配合使用,即读取DataRegister0[1:0]以及DataRegister1[30:29],DataRegister0[1:0]里的为来自DirtyRAM的部分状态信息,DataRegister1[30:29]里的为来自tagRAM的部分MOESI信息,

其具体的组合见下图:

比如读取到的DataRegister0[1:0]为1,以及DataRegister1[30:29]也为1,根据上图的组合关系,可知当前cacheline的MOESI状态为SharedDirty(O)。

示例代码如下:

;step1:writesetindexandwaynumintoDataCacheTagReadOperationRegisterMCRp15,3,r0,c15,c2,0;r0=get_Rd_data(VA,way_num);step2:readDataRegister1andDataRegister0MCRp15,3,r1,c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论