计算机系统原理——cachelab (第一周)

HNU计算机系统原理实验 专栏收录该内容
11 篇文章 0 订阅

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文件了解相关内容实验内容

二、搭建环境与分析脚本

1、valgrind安装

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二进制包安装;

2、学会PartA部分参考引用csim-ref模拟器使用命令行参数及使用方法

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文件

在这里插入图片描述

3、认识yi.trace中各项操作含义,并运行在缓存模型上,逐条分析trace文件操作且对比LRU替换策略,分析hit、miss、eviction结果产生过程

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。

三、创建与释放缓存

1、get_Opt函数体

getopt()函数,如果函数声明丢失,则在Unix命令行上自动解析元素,通常在循环中调用以检索参数,它的返回值存储在局部变量中,当getopt()返回-1时,没有更多的选项。
getopt函数解析命令行参数,argc、argv是调用main函数时传入的参数。传入的’-'开始的字符被解析为选项,getopt一次执行解析出一个option,如果循环执行,可以将argv中的全部option解析出来
在这里插入图片描述
在这里插入图片描述
解析输入参数,检查输入参数的合法性,用count数组计数器来保证四个s、E、b、t参数是必有的且仅有一个,用checkOptarg函数来检查输入的格式的正确性;

2、printHelpMenu函数体

在这里插入图片描述
模仿csim-ref的格式和内容;

3、checkOptarg函数体

csim 接受的参数中,-h, -v 是可选的,而其余参数都是缺一不可的,此外全部是非法参数;当缺少任意一个必要参数时或输入非法参数时,应当给出错误提示并打印使用帮助。但函数原型只有optarg,因此checkOptarg函数应是在get_Opt函数中使用且需要和get_Opt函数组合来检查输入的正确性;
optstring(getopt第三个参数)指定选项合法的选项,一个字符代表一个选项,在字符后面加一个’:'表示该选项带一个参数,若有参数,optarg指向该该参数;
在这里插入图片描述
因此optarg中是随在-s等后的数字,需要检查它是否缺失;若缺失则curOptarg不会是0-9;

4、initCache()函数体

初始化cache模拟缓存体;
在这里插入图片描述

5、freeCache()函数体

释放initCache函数体生成的内存
在这里插入图片描述

四、检验主函数编写与结果分析

到目前来说完成了模拟缓存的初始化、释放以及输入命令行参数的检查,接下来检验他们的正确性;

1、putSets()——输出初始化后的组的信息

在这里插入图片描述

2、main()

在这里插入图片描述
make clean -> make后检测./csim
-s没有s符号时会出现提示
在这里插入图片描述
在这里插入图片描述
输入正确时显示目前初始化的组的情况,初始化正确;

  • 1
    点赞
  • 0
    评论
  • 4
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

打赏作者

Flechazo_z

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值