这个lab让我深刻地体会到了自己还是一个菜鸟。。。。
lab分为AB两个部分。
先说Apart。要写一个C语言程序模拟cache的工作情况。
#include"cachelab.h"
#include<stdlib.h>
#include<getopt.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#define MAX 100
int misses,evictions,hits;
int s,E,b;//cache的参数
enum TYPE{HIT,MISS,MISS_HIT,MISS_EVICTION,MISS_EVICTION_HIT};//枚举出所有的结果
enum TYPE type;
typedef struct //use a 2-dimension array to simulate cache
{
int is_valid;
int tag;
int access_time;
}Cache;
Cache **cache;
int GetS(long long address) //从address中获得s参数
{
long long mask=0x7fffffffffffffff>>(63-s);//制作一个mask address 的结构 tag set offset 63-s 就是把除了s的部分置为零
return (address>>b)&mask;//b就是offset的部分
}
int GetT(long long address) //从address中获得tag参数
{
long long mask=0x7fffffffffffffff>>(63-s-b);
return (address>>(s+b))&mask;
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------
void update_time(int sel,int tarline)//更新访问的时间 sel是当前set tarline是set内line的行数
{
int i;
for(i=0;i<E;++i)
{
if(cache[sel][i].is_valid==1 &&
cache[sel][i].access_time>cache[sel][tarline].access_time)
//caches that visited before
--cache[sel][i].access_time;
}
cache[sel][tarline].access_time=E-1; //make it the newest
}
enum TYPE calcu(char instr[]) //get result of the instruction
{
char ins;
long long address;
int siz;
sscanf(instr," %c %llx %d", &ins, &address,&siz);//输入部分的格式
int sel=GetS(address);//sel是set的值
int tag=GetT(address);//tag是tag
int i;
for(i=0;i<E;++i)//E是每个set 的line的个数
{
if(cache[sel][i].is_valid==1 && cache[sel][i].tag==tag) //检查每一行 如果是vaild并tag相等则是找到了
{
if(ins=='M') //hit*2 for modify 按照文件中的说明 前面char是M的时候 hit两次
++hits;
++hits;
update_time(sel,i);//完成hit之后要更新访问时间
return HIT;//这种时候返回的TYPR就是HIT
}
}
++misses; //如果没有hit 那么misses加一
for(i=0;i<E;++i)
{
if(cache[sel][i].is_valid==0) //如果没有vaild的部分 也就是没有空位
{
cache[sel][i].is_valid=1;
cache[sel][i].tag=tag;
update_time(sel,i);//强行挤一个位置
if(ins=='M') //miss first and hit later for modify
{
++hits;//如果是M的情况 hit两次 就是MISS_HIT的情况
return MISS_HIT;
}
else//如果不是M 直接miss
return MISS;
}
}
++evictions; //means no room,must do eviction
for(i=0;i<E;++i)
{
if(cache[sel][i].access_time==0) //find the most early one 如果有可以替换的
{
cache[sel][i].tag=tag;
update_time(sel,i);