我正在编写一个CPU缓存模拟器,它将以字节为单位的缓存,每个缓存行的长度以字节为单位,以及缓存中的集合/组。
我写了大部分内容,但是我一直在努力工作几个小时就是弄清楚我需要向左/右移动多少位来提取标记和索引给定地址的字段。
例如,如果地址 48 ,我需要确定标记和索引。
这是我提取标签的方法,但我很确定它是不正确的。
int extractTag(int address, int sets){
int bits = exp2(sets); // number of bits to shift: 2^sets
unsigned int tag;
int tag = address >> (32 - bits);
return tag;
}
答案 0 :(得分:1)
假设您有BLOCK_SIZE行的SETS组。地址可以拆分为tag:index:offset,其中log2(BLOCK_SIZE)位为偏移量,log2(SETS)为索引,其余为标记。
您可以像这样计算log2:
int ilog2 (int x)
{
int result = 0;
while (x != 0) {
result++;
x = x >> 1;
}
return result;
}
因此你最终得到:
int extract_tag (int address, int sets, int block_size)
{
int offset_bits = ilog2(block_size);
int index_bits = ilog2(sets);
int tag = address >> (index_bits + offset_bits);
return tag;
}
int extract_index (int address, int sets, int block_size)
{
int offset_bits = ilog2(block_size);
int index_bits = ilog2(sets);
int index = (address >> offset_bits) & ((1 << index_bits) - 1);
return index;
}
int extract_offset (int address, int sets, int block_size)
{
int offset_bits = ilog2(block_size);
int offset = address & ((1 << offset_bits) - 1);
return offset;
}