請問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頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第第頁請問ARMv8如何讀取cacheline中的MOESI信息呢?

本文以Cortex-A53(處理器)為例,通過訪問處理器中的內部存儲單元(tag(RAM)和dirtyRAM),來讀取cacheline中的MOESI信息。

Cortex-A53提供了一種通過讀取一些系統(tǒng)(寄存器),來訪問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寄存器中。其編碼規(guī)則如下圖所示,只需將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狀態(tài)信息outer內存屬性valid信息可獲得的信息具體見下圖:

需要注意的是,如果是想獲取MOESI狀態(tài)信息,則需要兩個寄存器配合使用,即讀取DataRegister0[1:0]以及DataRegister1[30:29],DataRegister0[1:0]里的為來自DirtyRAM的部分狀態(tài)信息,DataRegister1[30:29]里的為來自tagRAM的部分MOESI信息,

其具體的組合見下圖:

比如讀取到的DataRegister0[1:0]為1,以及DataRegister1[30:29]也為1,根據上圖的組合關系,可知當前cacheline的MOESI狀態(tài)為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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論