[代码阅读]gem5 classic cache初步(3)

下面对cache中的mem_port端的主要操作进行分析:

 

这里我们把前一篇文章(初步2)中的trace图作为我们分析的“航海图”。根据上述的动态航海图,对于从mem端来的数据l2 cache首先调用MemSidePort::recvTiming(),其中主要的代码如下:

 

If(pkt->isRespnse()){

         myCache->handleResponse(pkt);

}else{

         myCache->snoopTiming(pkt);

}

 

这里从航海图可见,在读取内存后,调用的是第一个分支,即handleResponse(PacketPtr pkt),该模块内的主要过程有:

1.       BlkType* blk = tags->findBlock(pkt->getAddr());

         其中的findBlock只是调用set[i].findBlk(),而该函数只是简单地进行如下的遍历:

         for(i=0; i<assoc;i++) 

                if(blks[i]->tag == tag && blks[i]->isValid())

                     return blks[i];

         如果遍历无结果,那么简单的return 0;

 

2.       blk = handleFill(pkt, blk, writebacks);

       如果这里的blk==null,那么就需要进行allocateBlock(addr, writebacks)操作;

       其中的主要操作是tags->findVictim(addr, writebacks);

                    该操作只是简单的抓取 return sets[set].blks[assoc-1];

        然后回到allocateBlock(),如果获得的blk->isValid()那就再进行一些额外的操作,比如dirty 的话,就写回之类。

 

3.       satisfyCpuSideRequest(target->pkt, blk, true, mshr->hasPostDowngrade()):

       主要完成pktblk之间的数据交换工作:

         pkt->isWrite(),则调用 pkt->writeDataToBlock(blk->data, blkSize); blk->status |= BlkDirty;

         pkt->isRead(),则调用pkt->setDataFromBlock(blk->data, blkSize);

 

4.       完成satisfyCpuSideRequest()的操作后,最后需要进行cpuSidePort->respond(target->pkt, completion_time)的操作;

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值