May 7, 2024

存储器大Boss

前言

当初拿到这份讲义,翻到最后看到这题两眼一黑,如今终于可以面对,说实话这道大题超级综合,各种知识点的设计,包括计组的题目说实话每一句话都是知识点,给我们上课的M佬说实话真的不错,每听一遍课都有新的感悟

还以为考研期间没机会写文章了,然而这道大题完全值得一篇文章来精析

存储器大Boss

image-20240507211545643

1. 主考点:刷新周期与存储周期 & 刷新计数器位数

image-20240507220732564

由于 8 块 DRAM 组成 2GB 内存条,可得每个 DRAM 容量为 256 MB(2^28)

=> DRAM 芯片每个 2^14 行 2^14 列,即 16384 行 16384 列

再有异步刷新,且题目给出刷新周期为 10.485760ms,由王道P68页可知 两行之间刷新间隔为刷新周期除行数

=> 10.485760 / 16384 = 640ns

=> 640 / 40 = 16个存储周期

求间隔存储周期总结

  1. 求DRAM行数
  2. 算出两行间隔时间
  3. 题目要求有多少个存储周期,那么再除题目给出的存储周期即可

=> 刷新计数器即为行的位数也就是 14 位

2. 主考点:行缓冲容量计算 & 地址引脚复用

image-20240507213029073

=> 行缓存寄存器大小为 16384 字节

=> DRAM芯片的地址引脚个数为14个

3. 主考点:主存与Cache的地址结构

image-20240507213923172

算Cache前我觉得都理清一下基础信息:Cache行大小、Cache行数、Cache组号、主存地址结构

  1. Cache行的大小题干给出是64bit,那么就是8byte
  2. 由Cache数据区有512B且一行8byte,可知 512 / 8 = 64 行
  3. 由于4路组相连,可知 64 / 4 = 16 组
  4. 由于题目是组相连映射,且知组相连映射的地址结构为 TAG + 组号(4bit) + 块内映射(3bit)

16组 => 4bit组号,8byte大小 => 3bit块内映射,由于内存条为2GB,所以主存位数31位(自己做错的地方)

TAG = 31 - 4 - 3 = 24bit

image-20240507221915895

所以可以直接得知4个比较器

主要就是在标记阵列的求法了,标记阵列 = 有效位 + 脏位 + 算法替换位 + TAG

  1. 有效位

所有Cache行都会有一个有效位,所以这里 1bit

  1. 脏位

由题干可知采用了回写策略,所以脏位 1bit

  1. 算法替换位

由于是4路组相连,该计数器的位数与Cache组大小有关,所以为 2bit

  1. TAG

Cache的TAG,由主存地址结构的TAG推出,24bit

综上,数据 Cache 的标记矩阵为 (24 + 2 + 1 + 1) * 64 = 1792bit,也就是64行Cache行的总标记阵列,而数据阵列为512byte也就是4096bit,于是数据Cache总容量大小为 4096 + 1792 = 5888bit

4. 主考点:CPU访问Cache & 突发传送 & 轮流启动

image-20240508103516664

请问CPU读取指令A和指令B所需要的时间为多少?(指令Cache中,0-3组的标 记字段的内容如下图(仅包含有效位和标记))

image-20240508103713291

这里是卡我的第一个点,首先看这个地址要以更高的一个维度,整理一下知识点,当我们有了主存地址,对应不同的情况有不同的理解角度,考研计组中有三种方式

注意主存地址要根据不同映射方式解析为不同的地址结构,而该题组相连映射都是如此,也不要和Cache内的标记阵列弄混

image-20240507221915895

  1. 考察地址到Cache映射的时候,解析方式为 TAG + 组号 + 块内偏移
    • 通过组号找到对应组,再通过TAG进行标记找到目标Cache行,而块内偏移就是为了找到Cache行的某个字节
  2. 考察DRAM芯片交叉编址,解析方式是 芯片地址 + 组号
  3. 考虚拟存储系统,解析方式为 页号 + 页内地址

该问CPU读取时间显然是让我们模拟读取过程并计算,如图

image-20240508111404661

先访问Cache,也就是我刚刚总结的第一种情况,6123458DH先全部转为二进制,高24位为0C2468B,低7位(前四位是0001)

题干给出CPU主频为1GHz => 主频的倒数即为时钟周期,那么1GHz倒数即为 1ns

题干给出Cache命中的CPI(一条指令所要的时钟周期)为5

=> CPU读取指令A所要的时钟周期为 5 x 1 = 5ns

同样先访问Cache,6123458DH先全部转为二进制,高24位为0D08260H,低7位(前四位是0011),于是在0011组有对应TAG,但有效位为0,未命中

由题干可知

当出现CacheMiss时,总线采用突发传送总线事务从主存向Cache传输主存块。每次读突发传送总线事务的过程包括:送首地址和命令,DRAM芯片准备数据,传送数据。每次突发传送8B,传送地址或1B数据的时间需要5ns

总结一下突发传送总线数据

  1. CPU给主存传地址
  2. 连续传送主存块的存储单元

(PPT上讲的突发传送是送地址和存储点单元,这只是一般情况,具体题目具体情况分析)

这里也有一个需要注意的地方,题干中也给出数据线个数为8根,也就是8bit,而主存块个数为64bit(8byte),而同时启动要求是数据根数必须和主存块位数一样,所以不考虑同时启动,该题就是轮流启动

那么如图,由于未命中,所以从CPU传地址到主存,读取DRAM芯片,再到主存存入Cache的轮流启动过程

image-20240508120000855

最后CPU读取指令B,也就是当前已经从主存取来的数据由题干可知只要5ns

=> 5 + 85 = 90ns(用5ns访问Cache,85ns完成突发传送)

5. 主考点:Cache存入机制

image-20240508120108160

主存块大小为8B,一个int类型数据为4B,一个主存块可以包含2个int类型数据

=> 数组A存放在 128 / 2 = 64 个主存块中

题干中可知

开始时,数据Cache均为空。

所以当读取A[0]时候,Cache miss,用时90ns才能读到,而读A[1]时,这个时候该数据已经在Cache中,所以只要5ns读入

=> 也就说一个主存块中的两个int类型数据需要的总时间就是 90ns + 5ns = 95ns

于是可知,访问64个主存块中存储的 128 个int类型数据总时间为 95 * 64 = 6080ns

后记

终于写完了…差不多写了三个多小时??昨天下午光理解就花了好久,但感觉也非常值得,这次复盘把很多知识点都理了一遍,可以说是基础轮存储器大复盘的一个收尾,之后再遇到类似的题目就不怕了,这么huge的一个题目解决了,其他题目再多也不会多于此了。 – 2024.5.8 12:11

image-20240508122108730

DASCTF X SU
🍬
HFCTF2022
🍪

About this Post

This post is written by P.Z, licensed under CC BY-NC 4.0.