我对计算机架构还不熟悉。如果我说错了,请指正。
如果一个内存模块由 8 个内存芯片组成,并且每个芯片每个地址存储 4 位,那么通过将地址应用于模块的地址引脚,我可以从模块中的该地址获得 (8 x 4=) 32 位。但字节寻址表明每个字节都有一个地址。但在这里我使用地址访问 32 位。那么这怎么可能呢?
我认为如果每个芯片每个地址存储 1 位,那么通过将地址应用于模块,我就可以访问 8 位或一个字节。
答案1
首先,DIMM 上的内存组织对于程序甚至 CPU 来说都是非常透明的。但是... 在所有使用商用处理器和 DIMM 的近期系统中,DIMM 实际上都实现了 64 位宽的“字”(不是 32,甚至在 32 位 CPU 上也不是)。
过去,当商用 (x86) CPU 具有单独的地址和数据引脚时,如果您查看地址引脚上的标识,您会发现它们不是从 A0(地址的最低有效位)开始,而是从 A3 开始。因此,尽管程序断言的地址确实“一直向下”到地址位 0,并且在地址转换后,生成的物理地址也转到位 0,但物理地址的低位三位永远不会离开处理器。处理器以 8 字节(64 位)字读取和写入 RAM,并且这些字始终与 8 字节边界对齐。今天也是如此,即使地址和数据信号在总线上是多路复用的(即它们使用 CPU 上的相同引脚)。
例如,寻址小于 8 字节字的内容
MOV AL, [EBX]
(将地址在 EBX 中的字节移动到 A 寄存器的低位字节)全部在处理器和片上内存缓存中实现。内存控制器获取包含所需字节的 64 位字,并将其全部存储在缓存中。(实际上,缓存按“缓存行”组织,64 字节每个,因此八个连续的 64 位字从 DIMM 读入缓存,但不要介意......)然后将该字放在 CPU 的内部数据总线上,CPU 根据地址的低三位从该总线访问所需的字节。或者,也许缓存接口会这样做 - 这对我来说不清楚。
(当然,如果所需的单词已经在缓存中,则根本无法访问 DIMM。)
同样,为了写入单个字节,CPU(或缓存接口)必须从缓存中读取包含的 8 字节字,根据要影响的字节对其进行更改,然后将结果 8 字节字发送回缓存。最终将其刷新到 RAM。