memory - 字节序取决于处理器还是内存?

标签 memory language-agnostic hardware endianness cpu-architecture

Endianess 决定了一个字中字节的顺序。让我们考虑以下问题
内存系统:

enter image description here

所以这是一个字节可寻址的 32 位内存。 如果我将一个十六进制值 'val = 0x56789A' 移动到字地址为 0 的内存位置,对于 big endian 来说它看起来像这样:
enter image description here
像这样的小端:
enter image description here

但我们知道在寄存器中,值存储为'56789A' itslef,因此如果我们有大端类型字节顺序,这没有问题,因为可以按正确的顺序加载值。
但是对于必须颠倒顺序的小端呢?在小字节序中,它将被加载为“9A7856”,这是错误的。
那么我们是否将它像这样存储在内存中,(即)对小端类型排序有不同的组织?如 : enter image description here
现在我们可以将字地址位置“0”处的值加载到寄存器中以进行任何进一步的操作。 这是一个可能的解决方案。
但现在这意味着字节顺序将取决于存储单元的排列而不是处理器……这究竟是如何工作的?
还是字节顺序根本不受内存架构的影响而只受处理器的影响?那么最终字节序取决于处理器还是内存?

最佳答案

字节顺序实际上是一个接口(interface)问题。对于 32 位寄存器加载,一个接口(interface)要求 32 位值,内存接口(interface)提供一个字节数组。必须解决该接口(interface)的问题。如果它将字节数组解析为进入返回值最高有效位的低位字节,那么它就是大端字节序。如果它通过将低位字节放入返回值的最低有效位来解析它,则它是小端。

所以,您的真正问题是谁解析这些接口(interface)。从技术上讲,处理器如何从内存中请求数据很重要。如果它通过说“我想要一个 32 位值”来请求它,那么具有字节数组的内存必须解析它。如果它通过说“我想要 4 个字节”来请求它,那么处理器必须在将它存储到寄存器之前解决它。

按照惯例,处理器解析此接口(interface)。这允许内存与大端和小端处理器一起工作,因为它可以向两种类型的处理器提供相同的接口(interface)(字节数组),并且让处理器以任何它想要的方式解析它。存在过于简单化的风险:处理器在加载/存储单元和内存接口(interface)单元中解析它。寄存器永远不必考虑它,因为当它到达它们时,它是一个 32 位值,已经由内存接口(interface)单元从它从内存请求的字节数组中解析出来。

关于memory - 字节序取决于处理器还是内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15005634/

相关文章:

c++ - 让一个程序看到另一个程序的内存

c - 空指针取消引用未初始化的内存是否属于内存损坏

perl - 如何重构 for 循环中发生的递归以使其成为尾调用?

python - Python 进程和线程如何映射到硬件线程?

cuda - 是什么导致这个 CUDA 内核出现除法错误?

c++ - 8 字节或 16 字节数字的字节值

c++ - 你什么时候在 C++ 中使用 ZeroMemory 结构?

language-agnostic - 一个类应该直接使用它的私有(private)成员还是公开暴露的成员函数?

language-agnostic - 防止同一服务器 session 上的多个浏览器 session

c# - .NET 与西门子 PLC S7 200 的接口(interface)