本文共 2639 字,大约阅读时间需要 8 分钟。
cachelab工程以及valgrind下载:
pan.baidu.com/s/1XWH5Uq1jgtxdWoOx8vffkQ 码:7e8q
1、安装64位Linux系统
2、准备实验文件
1)下载cachelab-handout.tar与valgrind-3.12.0.tar.bz2文件并将其复制到Ubuntu中
2)在命令行界面用tar xvf 指令解压文件
3、阅读相关资料cachelab-ppt.pptx以及cachelab.pdf文件了解相关内容实验内容
handout 文件夹中的 traces 子文件夹中包含了一些 参考追迹文件 ,用于评估你在 Part A 中写的缓存模拟器是否正确。追迹文件由一个叫做 valgrind 的 Linux 程序生成。
1)sudo apt install valgrind
2)valgrind --version
valgrind-3.11.0版本安装成功
注:使用课程网站提供的valgrind-3.12.0版本安装时出现错误(在./configure与make指令之后的 make install指令执行出错),因此选择apt-get install valgrind二进制包安装;
Usage: ./csim-ref [-hv] -s <s> -E <E> -b <b> -t <tracefile>• -h:可选参数,打印使用说明 • -v:可选参数,展示追踪信息• -s <s>:缓存集下标的位数(S=2S) • -b <b>:块的位数(B=2b,块大小)• -E <E>:结合性(缓存集缓存行数) • -t <tracefile>:用于追迹的 valgrind trace 文件。使用方法如追踪yi.trace文件
1) yi.trace文件:
2) 使用csim-ref指令运行并-v展开追踪信息得到(上右图)
3) 每一行记录了一次或两次内存访问,每行的格式为:
[空格] 操作 地址,大小
“I”:表示指令加载,“L”:表示数据加载,“S”:数据存储;
“M”:数据修改(即在一次数据加载之后紧跟着一个数据存储)
“I”之前没有空格,而“M”,“L”,“S”前面要有空格。
4) 分析(加粗表示组索引s)
①L 10,数据加载:x10=0000…0001 0000,块偏移值为最低四位,故组索引s=1;
一开始的时候cache是空的,因此第一次访问的时候为miss;
②M 20,数据修改(加载与存储)0x20=000…0010 0000,组索引s=2;
所以第一次访问的时候没有内容,访问结果为miss,然后cache从低一级存储器读取内容,存储的时候结果为hit;
③L 22,数据加载:0x22=000…0010 0100,s=2;
由于操作②将该块存入高速缓存且标记位相等,故结果为hit;
④S 18,数据存储:0x18=000…0001 0100,组索引s=1;
由于之前的操作,该块已存入高速缓存且标记位都为1,故访问结果为hit
⑤L 110,数据加载:0x110=000…0001 0001 0000 故组索引s=1
操作④将该块存入高速缓存了但标记位不相等,故访问结果为miss,将块17装入17%4=1处,发生一次eviction;
⑥L 210,数据加载:0x210=000…0010 0001 0000,故组索引s=1;
这里标记位为2与标记位1不匹配,故访问结果为miss, cache读取新的行,发生一次eviction。
⑦M 12,数据修改:0x12=000…0001 0010,组索引s=1;
第一次访问结果为miss,因为在操作⑥的时候发生了一次行替换把该块驱逐了,即标记位不相等,cache重新读取该块,发生一次eviction,数据存储为hit。
getopt()函数,如果函数声明丢失,则在Unix命令行上自动解析元素,通常在循环中调用以检索参数,它的返回值存储在局部变量中,当getopt()返回-1时,没有更多的选项。
getopt函数解析命令行参数,argc、argv是调用main函数时传入的参数。传入的’-'开始的字符被解析为选项,getopt一次执行解析出一个option,如果循环执行,可以将argv中的全部option解析出来
解析输入参数,检查输入参数的合法性,用count数组计数器来保证四个s、E、b、t参数是必有的且仅有一个,用checkOptarg函数来检查输入的格式的正确性;
模仿csim-ref的格式和内容;
csim 接受的参数中,-h, -v 是可选的,而其余参数都是缺一不可的,此外全部是非法参数;当缺少任意一个必要参数时或输入非法参数时,应当给出错误提示并打印使用帮助。但函数原型只有optarg,因此checkOptarg函数应是在get_Opt函数中使用且需要和get_Opt函数组合来检查输入的正确性;
optstring(getopt第三个参数)指定选项合法的选项,一个字符代表一个选项,在字符后面加一个’:'表示该选项带一个参数,若有参数,optarg指向该该参数;
因此optarg中是随在-s等后的数字,需要检查它是否缺失;若缺失则curOptarg不会是0-9;
初始化cache模拟缓存体;
释放initCache函数体生成的内存
到目前来说完成了模拟缓存的初始化、释放以及输入命令行参数的检查,接下来检验他们的正确性;
make clean -> make后检测./csim
-s没有s符号时会出现提示
输入正确时显示目前初始化的组的情况,初始化正确;
转载地址:http://nefe.baihongyu.com/