【问题标题】:C : Memory Layout of c program and EndianessC : c 程序的内存布局和字节序
【发布时间】:2013-06-04 21:03:50
【问题描述】:

我有一个关于 C 程序的 Endianess 和内存布局的问题。我尝试搜索了几个站点,但都没有得到满意的答案。 “在标准 PC x86 计算机体系结构上,堆栈部分向下增长到较低的内存区域;在其他一些体系结构上,它的增长方向相反”。

堆栈是否在 Big Endian 架构中反向增长。我猜 High Memory 和 Low Memory 是逻辑地址,它们不是物理地址。

是他们很好的参考资料。

【问题讨论】:

  • 堆栈增长的方向与架构的字节序无关。

标签: c


【解决方案1】:

堆栈增长的方式与机器是大端还是小端无关。所有四种组合都是可能的,但绝大多数 大端和小端机器都有一个从高地址到低地址增长的堆栈。

堆栈增长的方向只是一个约定,尽管它可能在某种程度上融入到硬件中。新架构倾向于使堆栈向下增长,因为这是最常见的约定,因此某些程序无法正确处理另一种可能性。它最初很受欢迎,因为它避免了必须决定分配多少空间给堆栈(这是在 RAM 小于 32K 的机器上)。

逻辑与物理寻址是另一个不相关的属性。假设“逻辑”是指“虚拟”,堆栈会增长——无论它以何种方式增长——如果虚拟内存被占用,则在虚拟地址空间中增长,如果没有占用,则在物理地址空间中增长。有些 CPU 允许您关闭虚拟内存(例如 x86),有些则不允许(例如 Alpha)。

【讨论】:

  • “一些 CPU 让你关闭虚拟内存”从技术上讲,它们让操作系统打开/关闭它,没有非过时的操作系统(据我所知)允许用户级程序关闭它。跨度>
  • @kevin "You" 是指编写操作系统的人。
  • 从这个问题我猜 OP 不会很快编写操作系统。
  • @kevin 我不知道,这正是我希望那些试图理解 CPU 参考手册的缺乏经验的人提出的问题。
  • 除了堆栈向任一方向增长外,应注意“堆栈框架”可能向任一方向增长。也就是说,“帧头”可能位于(或靠近)存储的低地址或高地址侧,表示帧中的自动变量。通常帧头位于低地址端,尽管通常在“下方”有一些存储(例如寄存器保存区域)。考虑到系统设计人员将在呼叫返回路径中节省 3 个周期,这一切都可以得到令人难以置信的参与。
【解决方案2】:

正如已经回答的那样,字节序和内存布局之间没有关系。 这里有关于程序内存布局的好信息。 http://www.inf.udec.cl/~leo/teoX.pdf

您可以在 wiki 中找到有关字节序的所有信息。 https://www.princeton.edu/~achaney/tmve/wiki100k/docs/Endianness.html

【讨论】:

  • 感谢分享.我想这就是我没有得到“令人满意的答案”的原因。现在它清楚了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2013-05-24
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
相关资源
最近更新 更多