2011-06-24 32 views
1

我有兴趣了解CPU如何从总线宽度为32位的机器上的物理内存中读取单个字节和字。经过一段时间的搜索后,我发现了各种源,说明控制总线字节使能线用于影响与数据总线的字节相对应的四个单独存储体的存储体激活。在32位系统上传输<4字节数据

据我所知,只有可以被4整除的地址才被放置到地址总线上。但是,是否所有四个字节都读入数据总线,然后丢弃一些未使用的字节?例如,假设带有32位数据总线的CPU决定从位置1开始读取一个字(我知道由于数据对齐,这不太可能)。读取此字的方法是:

  1. 将地址0置于地址总线上。
  2. 将字节0,1,2和3放置到数据总线上。
  3. 丢弃字节0和3(清除它们各自的比特)
  4. 使得字节1是在第三行和字节2是在第4个银行
  5. 调度重新安排在数据总线上字节1和2将数据总线上的值更改为控制单元内寄存的存储器数据。
+2

我不得不说*至少取决于架构*。 – 2011-06-24 02:50:38

+0

@pst这是一个x86,如果这有助于 –

回答

2

非常多的依赖于建筑类的东西。除此之外,你有处理器总线,也许在其他支持芯片的另一边,可能是dram或pcie或其他也有其自己的规则和细微差别的接口。或者如果芯片有多个接口,那么每个接口可能会有所不同。

这几天你会看到你描述的东西。

读取比写入具有更多的灵活性,因为例如您的存储器或外围系统可以像所有内容一样简单,因为所有内容都是32位,并且靠近处理器的存储器接口可以选择和操作字节通道而无需外设或内存知道。有时候你确实有字节选择线,告诉外设我所关心的是这些字节通道,而外设可以选择笨拙而简单,只需将所有四个字节放在那里,或者只填写请求的字节并保持其他线路悬空或者用陈旧的数据驱动或驱动高或低。有些系统希望你右对齐或左对齐数据,所以如果你想要地址为0x01的字节,存储器接口可能期望结果字节位于最左边或最右边的字节通道上,这取决于字节顺序(我并不是将此答案限制为顺便说一下x86)。

写入需要一些更多的细节,如果你有一个系统允许你(系统已定义)你可以写入单个字节,但总线是32位的系统,那么你可以有右对齐或左对齐的东西,并指定地址和大小。或者你可以做bytelane的事情,双方都必须从正确的字节通道中选择数据。在这种情况下,要写入的外设将需要管理读 - 修改 - 写操作(写入包含0x12345678的32位存储器时,地址0x02处的字节0x55在写入完成时将导致0x12555678,此时外设必须读取0x12345678修改一个字节,然后将32位写回内存

x86是一个非常痛苦的平台,它允许未对齐的访问,许多其他平台强制内存对齐,使代码更容易,执行更顺畅,并且存储器接口和外围设备更简单(逻辑更少,功耗更低,除性能外更少)。因此,对于像这样的系统,您仍然拥有用于单个字节访问的字节通道,但不必担心32位写入地址0x01,通常在x86上处理,例如两次访问,一个24位地址1和一个8位于地址0,这就是为什么不对齐的原因,尽管在x86平台上合法性不好,所以你的性能减半。对齐意味着32位访问只能在较低两位为零(2个电源为2个字节或4个字节),0x0,0x04,0x08,0x0c,0x10等的地址上.16位访问位于功率1的边界,地址的低位为零,0x0 0x02 0x04 0x06 0x08。并且字节在字节边界上,2到电源0,0x01 0x02 0x03 0x04等

在一些系统上,一般如何在x86系统上处理当前的数据,例如当你有DRAM(DDR等)时, ,尤其是具有ecc功能的ram接口,在存储器层本身,只能写入完整的N位数量,例如64位,带有8位ecc,因为他们必须计算64位数据中的8位ecc位咬住并一次写入全部72位,当读回时,全部72位被读取和检查,如果64位数据返回给用户/程序。通常情况下,所有这些都是通过缓存层进行的,高速缓存的优点之一在于它位于处理器和更大的内存系统之间。至少在读取的情况下,您可能需要读取一个字节,但高速缓存可能会读取128位,或者高速缓存行的大小,通常是存储器的整数个单位。该缓存行停留在缓存中,当您写入刚刚读取的字节旁边的一个字节,或者可能是同一个字节时,它将修改该缓存中的该字节,最终当它必须从内存中逐出该数据时,它会写入整个缓存行回来,在内存很好的整体单位。字节写入缓存未命中并且类似的事情仍然涉及读取 - 修改 - 写入。

有或没​​有高速缓存系统有时,处理器上或接近处理器的存储器接口管理读取修改写入,并确保只有以字对齐的方式访问外围设备或主存储器(其中一个字是16或32或64无论内存系统定义为该总线的大小)。

昨天我在看旧的x86引脚,忘了数据和一些地址总线在同一个引脚上。存储周期和数据部分有地址周期,处理器和外设必须改变方向或至少使用某种方法来管理总线。这里的要点是,在x86架构的历史中,事情已经发生了变化并不断变化。所以这个答案是特定于体系结构的,不能仅限于x86,你必须针对引脚/焊盘布局以及与之配套的芯片组。 ARM在其生命周期中也发生了变化,并且有时会提供具有不同接口选项的相同内核(例如AXI 32位或AXI 64位)。

Dram还增加了刷新的复杂性,所以某个地方的人必须不断地通过内存保持活动状态,在由处理器或缓存驱动的访问之间。同样,ecc增加了复杂性,如果存在单个位错误,理想情况下需要用修正的位执行回写。因此,字节读取可能导致32位写入,与软件的操作无关。如果没有回写机制,那么拥有ecc保护是非常愚蠢的,只是使用奇偶校验,或者没有。

我实际上并不熟悉的wishbone接口,但看到它在整个opencores中使用,可能是您可以查看和感受的东西。同样,任何x86系列产品都将拥有或者至少包含旧系列的硬件参考手册,用于描述芯片边缘的内存/ I/O接口的时序。对于ARM,你可以谷歌的amba和axi,如果你得到他们的缓存trm的(技术参考手册)(免费提供武器网站),你可能会得到一些洞察他们的内存接口如何工作。同样的DDR引脚和细节应该可以从供应商或甚至在维基百科上获得。DDR和QDR更加有趣,因为你可以在半个时钟周期内发生事情,传统上,每个时钟周期或多个时钟周期只改变一次总线,现在我们在时钟周期的中间阶段正在发生变化,可以有一个时钟输出存储设备和一个单独的时钟从存储器设备回来,以允许迹线长度损失,并试图帮助这个半时钟周期的事情。这是非常混乱的,这使得它更容易回到旧的芯片(808x,6502,6800,z80等),并查看他们的内存总线,并继续前进。在尝试潜入PCI或PCIe之前,同样看看ISA。

哇,很长的答案,对不起,希望它是有帮助的。

+0

@ dwelch-感谢您在回答我的问题时的努力 - 它确实有助于解释和澄清我之前阅读的内容。 –