直接映射缓存位
Direct Mapped Cache Bits
所以我无法理解直接映射缓存的某些部分。我有一个字节寻址的内存系统,它有 64KB 内存和一个 2KB 直接映射缓存。缓存块为 32 字节。
据我了解,如果我错了请纠正我,我有 2048B/32B = 64 个缓存块。我需要弄清楚每个缓存条目(标记、"dirty" 位等)总共需要多少位。
我相信我需要 6 个索引位(2^6 = 64(# of blocks))
和 5 个偏移位(2^5 = 32(缓存块的大小))
我只是无法找出所需的其余部分。
物理地址的位可以分为 3 组 - 最低有效位组决定 "offset of byte within cache block" 并且不需要存储在标签中,中间位组决定 "offset of byte within cache block" "index of cache block within the cache"并且不需要存储在tag中,最高位组用于校验缓存中的数据是否是你想要的数据,必须存储在tag中。
对于 64 KiB 的物理地址 space,一个物理地址将有 16 位;如果您的缓存是 2048 字节,那么(对于 "direct mapped")最低有效位组和中间位组加起来必须总共为 11 位。这意味着最重要的一组位(必须存储在标签中)需要是 5 位(因为 16 位 - 11 位 = 5 位)。
对于其他位;您总是需要一些东西来指示该条目是已使用还是为空;如果缓存是 "write-back" 你需要一个脏位但是如果缓存是 "write-through" 你不需要;如果有多个 CPU 和缓存一致性,则需要更多位(例如 exclusive/shared);如果有任何类型的错误检测或纠正,您需要更多的位(例如 "parity bit")。这意味着总标签大小至少为 6 位(但可能更多)。
所以我无法理解直接映射缓存的某些部分。我有一个字节寻址的内存系统,它有 64KB 内存和一个 2KB 直接映射缓存。缓存块为 32 字节。
据我了解,如果我错了请纠正我,我有 2048B/32B = 64 个缓存块。我需要弄清楚每个缓存条目(标记、"dirty" 位等)总共需要多少位。
我相信我需要 6 个索引位(2^6 = 64(# of blocks)) 和 5 个偏移位(2^5 = 32(缓存块的大小)) 我只是无法找出所需的其余部分。
物理地址的位可以分为 3 组 - 最低有效位组决定 "offset of byte within cache block" 并且不需要存储在标签中,中间位组决定 "offset of byte within cache block" "index of cache block within the cache"并且不需要存储在tag中,最高位组用于校验缓存中的数据是否是你想要的数据,必须存储在tag中。
对于 64 KiB 的物理地址 space,一个物理地址将有 16 位;如果您的缓存是 2048 字节,那么(对于 "direct mapped")最低有效位组和中间位组加起来必须总共为 11 位。这意味着最重要的一组位(必须存储在标签中)需要是 5 位(因为 16 位 - 11 位 = 5 位)。
对于其他位;您总是需要一些东西来指示该条目是已使用还是为空;如果缓存是 "write-back" 你需要一个脏位但是如果缓存是 "write-through" 你不需要;如果有多个 CPU 和缓存一致性,则需要更多位(例如 exclusive/shared);如果有任何类型的错误检测或纠正,您需要更多的位(例如 "parity bit")。这意味着总标签大小至少为 6 位(但可能更多)。