[代碼閱讀]gem5 classic cache初步(2)

下面的分析主要集中classic cache有關的文件:

Cache.cc, cache.hh, cache_impl.hh,以及tag中的lru.cc,lru.hh等文件。

 

Lru.cc中的內容不復雜,我們先來分析,主要完成的功能是:

insertBlock, findVictim等相關容易掌握的函數,這裏不再作深入探討;

 

主要的問題在於cache.hh, cache.cc以及cache_impl.hh等部分,其中的cache_impl.hh部分是實現cache具體操作的主要部分,其中只有功能模塊的定義,沒有關於調用過程的信息,爲了把握其中的相關信息,我們開啓其中的debug功能,生成相關的trace:

 

     0: system.cpu0.icache: ReadReq (ifetch) 1cb60 miss

  1000: system.l2: ReadReq (ifetch) 1cb40 miss

 41000: system.l2: Handling response to 1cb40

 41000: system.l2: Block for addr 1cb40 being updated in Cache

 41000: system.l2: Block addr 1cb40 moving from state 0 to 7

 52000: system.cpu0.icache: Handling response to 1cb40

 52000: system.cpu0.icache: Block for addr 1cb40 being updated in Cache

 52000: system.cpu0.icache: Block addr 1cb40 moving from state 0 to 7

 54000: system.cpu0.icache: ReadReq (ifetch) 1cb64 hit

 55000: system.cpu0.icache: ReadReq (ifetch) 1cb64 hit

 

根據上述的部分trace內容,我們再回到cache_impl.hh中的源代碼,知道處理流程與代碼中模塊的對應關係,但是上面的trace內容少了些,因此我們打算在源代碼中再增加一些DPRINTF語句來便於更好的追蹤,經過自己增加額外的DPRINTF語句後,我們分析得出cache模塊操作的兩個起點在於如下:

 

1.      面向cpu;cpu_side_port:

CpuSidePort::recvTiming(…){

myCache->timingAccess(pkt);

}                              

 

2.      面向mem:

MemSidePort::recvTiming(){

myCache->handleResponse(pkt);

}

上述的兩個端口就決定了我們的分析切入點,那接下來要分析的事情就變得很簡單了:從這兩個起點入手,一步步地跟蹤分析即可。另外還需要考慮的就是緩存同步問題,相應的分析入口就在MemSidePort::recvTiming(){}中的myCache->snooptiming(pkt)。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章