真正的内存结构是啥? [复制]

Posted

技术标签:

【中文标题】真正的内存结构是啥? [复制]【英文标题】:What is the real memory structure? [duplicate]真正的内存结构是什么? [复制] 【发布时间】:2018-06-22 09:40:09 【问题描述】:

我对与记忆有关的事情有一个愚蠢的怀疑。我的疑问是:为什么在内存中,较高的地址被考虑在“底部”,而最低的地址被考虑在“顶部”?我将更详细地解释:

堆栈内存从高地址开始并增长到低地址。到目前为止,这就是我所理解的,但是为什么堆栈会“向上”增长?为什么较低的地址位于内存的顶部?

我见过各种相互矛盾的内存结构:将低地址考虑在内存底部的内存结构,以及将低地址考虑在内存顶部的内存结构。是否取决于处理器?

提前谢谢你。

【问题讨论】:

你在哪里看到说内存地址是这样的?堆栈通常与内存不同 你有没有注意到数学家和程序员是如何画树的?根始终在顶部。 你为什么要问?你在编写什么样的程序?用什么编程语言?在什么计算机和操作系统上?为什么这个问题对你很重要?如果你用 C 编写代码,这通常是一个不重要的细节...... 【参考方案1】:

这取决于instruction set architecture 和ABI。它们都影响call stack 的组织(和发展方向)。

通常调用堆栈会向下增长,但在某些 ISA 中情况并非如此(请参阅 this)。并且一些 ISA(例如 IBM serie Z 大型机)没有任何硬件调用堆栈(那么,调用堆栈只是关于寄存器使用的 ABI 约定)。

大多数application software(例如您的游戏、文字处理器、编译器等)都在一些operating system 之上运行,在一些process 上运行一些virtual address space(所以在virtual memory)。

阅读一些关于操作系统的书,例如Operating Systems: Three Easy Pieces.

在实践中(除非您编写一些操作系统内核来管理虚拟内存),您最关心的是虚拟地址空间(通常由许多不连续的段组成)。在 Linux 上,使用/proc/(参见proc(5))来探索它(例如,在您的终端中尝试cat /proc/$$/maps)。请注意,对于多线程应用程序,每个thread 都有自己的调用堆栈。那么虚拟地址空间的“顶部”或“底部”并不重要,也没有多大意义。

如果(作为大多数人)您正在(使用除汇编程序之外的任何编程语言)在某些操作系统之上编写某些应用程序软件,那么您(作为开发人员)并不关心真实内存,但关于virtual memory 和resident set size。您不关心堆栈的增长(它由操作系统、编译器、ISA 管理...对于您的代码的automatic variables)。你需要避免stack overflow。经常发生一些pages(例如你的code segment[s]),也许那些包含从未使用过的代码,永远不会进入RAM并留下paged。实际上,某些进程的大部分(虚拟)内存不是为其调用堆栈:您通常在堆中分配内存。我的 firefox 浏览器(在我的 Linux 桌面上)有 2.3 GB 的虚拟地址空间(超过一千个段),但只有 124 KB 的堆栈。阅读memory management。调用堆栈通常是有限的(例如几兆字节)。

【讨论】:

为什么投反对票? 一个,因为“它取决于”不需要五个段落和十几个链接(尤其是当这些链接中的 80% 仅与问题相关时)。第二,因为在所有这些杂乱无章的事情中,你没有给出一个硬件调用堆栈向上增长的例子——一类例子会反驳问题中固有的错误前提。 (第三个,因为实际上调用堆栈向下增长是有充分理由的,在他们这样做的情况下 - 但你认为不适合提及它,因此完全避免实际回答这个问题。) @cHao:随时提供您更好的答案。我迫不及待地想读它。 我会,如果问题还没有作为副本关闭。但对副本的答案提供了一些解释。

以上是关于真正的内存结构是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

结构体指针在使用完free后,该指针所指向的内存区域是啥,这个指针是变成了NULL,还是野指针。

如何测量数据结构的内存使用情况? [复制]

如何将嵌套结构的成员复制到 CUDA 设备的内存空间?

C#内存复制结构

将结构数组复制到共享内存中

为啥 Java/JVM 实现选择 HEAP 数据结构在内存中存储对象? [复制]