有一主存/Cache层次的存储器,其主存容量8MB,Cache容量256KB,每个数据块(块或行)的大小为 32B,若采用直接相联映射方式。主存地址为 200166H映射到Cache中的行号(十进制数表示) 是。(注:Cache中行的编号从0开始,)
时间: 2024-04-03 10:31:38 浏览: 201
首先计算主存中200166H地址所在的块号,因为每个块大小为32B,所以块号为:
200166H / 32B = 6255
Cache容量为256KB,即2^18B,每个块大小为32B,所以Cache中共有2^18 / 32 = 2^13个块。
采用直接相联映射方式,每个主存地址只能映射到Cache中的唯一一行。因为Cache中共有2^13个块,所以每个块对应的行号可以用块号模2^13来计算,即:
6255 % 2^13 = 6255 & (2^13 - 1) = 6255 & 8191 = 207
所以,主存地址为200166H映射到Cache中的行号为207。
相关问题
有一主存-cache层次的存储器,其主存容量为1MB,cache容量为16KB,每字块有8个字,每字32位,采用直接映像方式,若主存地址为35301H,且CPU访问cache命中,则在cache的第( )(十进制表示)字块中(cache起始字块为第0字块)。
根据直接映射方式,主存地址的低7位用于标记字内偏移地址,接下来的10位用于标记主存中的块地址,高位则用于标记主存中的页地址。在本题中,主存容量为1MB,即20位地址空间,因此主存的页数为2的10次方,即1024页。每页的大小为2的10次方字节,即1KB。所以主存中每页有32个字块。
cache容量为16KB,即2的14次方字节,因此cache的页数为2的10次方,即1024页。每页的大小为2的3次方个字块,即8个字块。
根据题目中给出的主存地址35301H,可以得到它所在的块地址为35301H除以8,即4412H,对应的页地址为4412H除以32,即160H。
由于采用直接映射方式,主存中的一个块只能映射到cache中的一个特定的块中。在本题中,cache中的第i块所对应的主存块的地址为i乘以8,因为每个块有8个字。
因此,要求在cache中的第几块中存储主存地址35301H所在的块,需要用主存地址的块地址对cache的页数取模,即4412H对1024取模,得到108H。因为每页有8个块,所以可以得到在cache的第13块中存储了主存地址35301H所在的块。
主存—Cache层次的存储器,以字编址(1字=4字节)。主存容量为4MB,Cache容量64KB,主存和Cache以相同大小分块(行),每块(行)大小512B。设计一个4路组相联映像(即Cache每组4个块)的Cache组织,问: 1)写出C
ache的数据结构定义;
struct CacheLine {
bool valid; // 有效位
bool dirty; // 脏位
uint32_t tag; // 标记位
uint8_t data[512]; // 数据
};
struct CacheSet {
CacheLine lines[4]; // 每组4个Cache行
};
struct Cache {
CacheSet sets[128]; // Cache共128组
};
// 每个Cache块大小为512B,即4个字
// Cache共64KB,即128个块,128组
// 每组4个块,即4路组相联映像
// 每个Cache行包括有效位、脏位、标记位和数据
2)写出访问主存地址为0x12345678的数据时,Cache的读取过程;
读取地址为0x12345678的数据时,首先计算出该地址所在的Cache块在Cache中的索引,即为set_index = (0x12345678 >> 6) & 0x7f,其中0x7f为十进制数127,表示二进制下7位全为1。然后计算出该地址所在Cache块的标记位,即为tag = 0x12345678 >> 13。接着在Cache的set_index组中查找是否有与tag相同的Cache行,若有则表示命中Cache,直接返回该Cache行中对应地址的数据;若没有则表示未命中Cache,需要从主存中读取该地址所在的块,并将其存入Cache中。由于是4路组相联映像,需要找到set_index组中一个无效的Cache行,将读取的数据存入其中,并将其标记为有效。若set_index组中没有无效的Cache行,则需要选择其中一个替换出去。由于是LRU策略,可以将最久未使用的Cache行替换出去,并将新读取的数据存入其中。最后将存储了数据的Cache行中对应地址的数据返回即可。
3)写出向主存地址为0x12345678写入数据时,Cache的写入过程。
向地址为0x12345678的数据写入数据时,先检查Cache中是否已有该地址的数据。如果有,需要将该Cache行中对应地址的数据修改为新数据,并将脏位设置为1,表示该Cache行中的数据已被修改过。如果没有,则需要先从主存中读取该地址所在的块,并将其存入Cache中。由于是4路组相联映像,需要找到set_index组中一个无效的Cache行,将读取的数据存入其中,并将其标记为有效。若set_index组中没有无效的Cache行,则需要选择其中一个替换出去。由于是LRU策略,可以将最久未使用的Cache行替换出去,并将新读取的数据存入其中。最后将存储了数据的Cache行中对应地址的数据修改为新数据,并将脏位设置为1,表示该Cache行中的数据已被修改过。最后再将修改过的Cache行中的数据写回主存即可。
阅读全文