我在学校被问过这个问题:
假设一个字节寻址存储器有1M的可寻址空间和一个由64个块组成的缓存,每个块包含8个字节。该缓存是直接映射的。
缓存的大小是多少?
有多少个偏移位?
有多少个行位?
有多少个标记位?
我知道如何回答这些问题,但为什么我需要知道内存是字节可寻址的?
如果是字或长字可寻址,答案会有什么变化?
答案1
什么是字节?
字节是用于存储的内存单元,内存芯片中充满了这样的字节。内存单元是可寻址的。这是我们使用内存的唯一方式。
实际上,内存只能按字节寻址。这意味着二进制地址始终只指向单个字节。一个字只是一组字节——2、4、8,具体取决于 CPU 的数据总线大小。
你需要理解?
要完全理解内存操作,您必须熟悉 CPU 的各种寄存器和 RAM 的内存端口。我假设您知道“MAR 内存地址寄存器”、“MDR 内存数据寄存器”、“PC 程序计数器寄存器”、“MBR 内存缓冲寄存器”的含义。RAM 有两个内存端口:32 位用于数据/地址,8 位用于 OPCODE。
假设 CPU 想要从地址 xyz 开始读取一个字(比如 4 个字节)。CPU 会将地址放在 MAR 上,向内存控制器芯片发送内存读取信号。在收到地址和读取信号后,内存控制器会将数据总线连接到 32 位端口,从地址 xyz 开始的 4 个字节会从端口流出到 MDR。
如果 CPU 想要获取下一条指令,它会将地址放入 PC 寄存器并向内存控制器发送获取信号。在收到地址和获取信号后,内存控制器会将数据总线连接到 8 位端口,位于所接收地址的单字节长操作码将从 RAM 流出到 CPU 的 MDR。
这就是我们说某个寄存器是“内存可寻址”或“字节可寻址”时的意思。现在,当您将二进制十进制 2 放在 MAR 上并打算读取“字”2 而不是(字节 2)时会发生什么?
对于 32 位机器,字号 2 表示字节 4、5、6、7。实际上,物理内存只能按字节寻址。因此,处理“字寻址”有一个技巧。当 MAR 放置在地址总线上时,其 32 位不会分别映射到 32 条地址线 0-31。相反,MAR 位 0 连接到地址总线 2,MAR 位 1 连接到地址总线 3,依此类推。MAR 的高 2 位被丢弃,因为它们仅适用于 2^32 以上的字地址,而这些地址对于我们的 32 位机器来说都是不合法的。使用这种映射,当 MAR 为 1 时,地址 4 被放到总线上,当 MAR 为 2 时,地址 8 被放到总线上,依此类推。