Memory 转移<;32位系统上的4字节数据

Memory 转移<;32位系统上的4字节数据,memory,byte,32-bit,transfer,low-level,Memory,Byte,32 Bit,Transfer,Low Level,我感兴趣的是学习CPU如何从总线宽度为32位的机器上的物理内存中读取单个字节和单词。在搜索了一段时间后,我找到了各种来源,指出控制总线字节使能线用于影响与数据总线字节对应的四个单独内存组的组激活 据我所知,只有可被4整除的地址才会被放在地址总线上。但是,是否所有四个字节都读入数据总线,然后丢弃一些未使用的字节?例如,假设具有32位数据总线的CPU决定读取从位置1开始的字(我知道由于数据对齐,这是不可能的)。读这个词的方法是: 将地址0放在地址总线上 将字节0、1、2和3放到数据总线上 丢弃字节0

我感兴趣的是学习CPU如何从总线宽度为32位的机器上的物理内存中读取单个字节和单词。在搜索了一段时间后,我找到了各种来源,指出控制总线字节使能线用于影响与数据总线字节对应的四个单独内存组的组激活

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

  • 将地址0放在地址总线上
  • 将字节0、1、2和3放到数据总线上
  • 丢弃字节0和3(清除它们各自的位)
  • 在数据总线上重新排列字节1和2,以便字节1位于第3列,字节2位于第4列
  • 将数据总线上的更改值分配到控制单元内注册的存储器数据

  • 这在很大程度上取决于建筑。除此之外,您还有处理器总线,可能在其他支持芯片的另一侧,可能是dram或pcie或其他接口,它们也有自己的规则和细微差别。或者,如果芯片有多个接口,那么每个接口都可能不同

    这些天你会看到你描述的各种事情

    读操作比写操作更灵活,因为例如,内存或外围系统可以简单到每件事情都是32位的,而且靠近处理器的内存接口可以在外围设备或内存不知道的情况下选择和操作字节通道。有时你确实有字节选择行,告诉外设我所关心的是这些字节通道,外设可以选择是哑的和简单的,只把所有四个字节放在那里,或者只填充请求的字节,让其他行浮动,或者用陈旧的数据驱动,或者驱动高或低。一些系统希望您对数据进行右对齐或左对齐,因此如果您希望地址0x01处的字节,内存接口可能希望结果字节位于最左边或最右边的字节通道上,具体取决于endianness(顺便说一句,我不将此答案限制为x86)

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

    x86是一个非常痛苦的平台,它允许未对齐的访问。许多其他平台强制内存对齐,使代码更容易,执行更顺畅,内存接口和外围设备更简单(逻辑更少,功耗更低,除性能之外的所有功能都更少)。因此,对于这样的系统,您仍然有用于单个字节访问的字节通道,但不必担心32位写入地址0x01,这通常在x86上处理,例如,两次访问,地址1处24位,地址0处8位,这就是为什么在x86平台上未对齐(尽管法律不好)会降低性能的原因e的一半。对齐意味着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个数据位良好,则读取并检查所有72位位返回给用户/程序。所有这些通常是通过缓存层工作的,缓存的优点之一是它位于处理器和更大的内存系统之间。至少在读取的情况下,您可能希望读取一个字节,但缓存可以读取128位,或者无论缓存线的大小,这通常是内存的一些整数单位。缓存线保留在缓存中,当您写入刚读取的字节旁边的一个字节,或者可能是同一个字节时,它会修改缓存中的该字节,最终当它必须从内存中取出数据时,它会将整个缓存线写回,以非常有效的内存整数单位。字节用c写ache miss和类似的事情仍然需要读修改写

    有或没有高速缓存系统有时,处理器上或更靠近处理器的内存接口管理读-修改-写操作,并确保仅以字对齐方式访问外设或主内存(其中字为16、32或64位,无论内存系统定义为该总线的大小如何)

    昨天我在看一个旧x86的引脚,忘记了数据和一些地址总线在同一个引脚上。内存周期和数据部分中有地址周期,处理器和外围设备必须改变方向,或者至少使用某种方法来改变