堆和栈内存划分的主要来源是什么?

What is the main origin of heap and stack memory division?

我看了很多关于堆和栈内存的解释,反正都是晦涩难懂。首先,我了解这种记忆如何与软件一起工作,但我不了解这种划分的主要来源。我假设它们是相同的非专用物理内存,但是...

例如,假设我们的 PC 没有任何 OS,我们想用 x86 的汇编语言创建一些可引导程序。我假设我们可以做到这一点(我个人不知道汇编,但有些人写 OS 无论如何)。所以主要问题是我们是否已经可以使用堆和堆栈进行操作,或者我们必须为此创建一些内存管理机制?如果是,那么在裸机编程方面如何可能?

在另一个答案中添加一些内容,相当正确但可能不是很完整。

堆和栈是 "manage" 内存的两种(软件)方式。通常,物理内存是单元格的平面阵列,程序可以在其中读写。 运行 程序可以根据需要使用这些单元格。但还有很多话要说。

1^ 件事。堆完全是软件,而堆栈也是(或主要)硬件。大多数处理器都有硬件(或 CPU 指令)来支持堆栈,而大多数(或全部?)不关心堆。甚至更多:有小型嵌入式处理器(或微控制器)有一个独立的堆栈区域——完全不同于程序可以创建 "heap".

的其他 ram 区域

2^ 事情。说到 "programs",有人 can/should 认为操作系统 (OS) 一个专门管理资源(包括内存)的程序,并且可以用 "applications" 扩展(这是程序)。在这种情况下,堆栈和堆由 OS 和应用程序共同管理。

因此,要回答您的主要问题,90% 的正确答案是:在裸机中您已经有一个堆栈 - 也许您必须发出一些简短的指令来设置它,但这很简单。但是你没有堆,你必须在你的程序中实现它。首先你留出一些内存作为堆栈使用;然后你可以预留一些内存用作堆,不要忘记你必须为 normal/static 数据保留一些内存。管理堆的程序部分应该知道该做什么,使用但不会不规律地覆盖堆栈和静态数据,以执行其功能。