下面的分析主要集中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)。