7

据我所知,一个汇编程序分为两个 - 1)代码2)数据。现在,当我们在 c\c++ 上编写代码时,代码被加载到内存中,然后 CPU 开始执行代码,一条一条指令,作为汇编程序。我的问题是: 1. c 代码存储在哪里?我的意思是,当我在 Visual Studio 中运行一个程序时,代码是否加载到其中一个——堆、堆栈……?2.所以内存实际上分为Stack,Heap和Date段,但是当CPU执行程序时,作为汇编程序,它们都是1个具有相同数据区域的汇编程序还是它们形成的,比如说2还是 3 个从一个跳到另一个的汇编程序?

** 让我添加这个问题,也许它会澄清我的意图:当我启动一个 C 程序时,代码(机器指令)被加载到内存中。所以,这是一个汇编程序。但是内存划分是如何发生的呢?我的意思是,堆栈、数据段等不同的内存部分如何修改汇编程序?

4

2 回答 2

8

来自维基百科:

PC 架构支持程序中的几个基本读写内存区域,即:堆栈、数据和代码。堆是程序可用的另一个地址空间区域,操作系统可以从其中动态分配或释放内存,以响应诸如 malloc 和 free 之类的系统调用。

我建议你阅读全文

SO上还有这个问题: 堆,堆栈,文本等不同的段与物理内存有何关系?

此外,这些文章可能值得一读。尤其是最后一个:

要回答您的问题:

1.c代码存放在哪里?

在代码段中。

2.所以内存实际上被划分为Stack、Heap和Date段,

在实模式下,是的。在保护模式下……取决于。极其简化:程序内存映射到物理内存。每个程序都存在于自己的地址空间中。

如果您想了解更多信息,我推荐这些文章:

3.但是当CPU执行程序时,作为一个汇编程序,它们都是1个具有相同数据区域的汇编程序还是它们形成的,比如说2个或3个汇编程序从一个跳转到另一个?

不,没有跳跃。处理器寄存器指向要执行的下一条指令。其他人则指向堆栈等。

于 2013-04-03T16:37:37.923 回答
7

是对象和可执行文件中的连续划分,很像书中的章节。stack 和 bss 部分在文件中不存在,但在运行时创建。

这些部分的重点主要是将程序划分为操作系统可以以不同方式保护的区域。为了安排这一点,这些部分必须从页面边界开始并且在内存中是连续的。

基本(“重要”)部分是......

文本代码- 操作系统将对此部分进行写保护,并且由于它是不可变的,它还可以在运行相同可执行文件的多个进程或线程之间共享它

数据- 操作系统将映射此 r/w 并且不会直接​​1共享它

bss - 本节由零初始化数据组成。

stack - 通常与程序分离,它通常从更高的地址向下增长

最后两个部分不在可执行文件中,因为它们不需要任何初始化。

如果您询问它们是如何实现的,那么,汇编器和链接器会创建一个目录,并像书中的章节一样以二进制形式写出各个部分。操作系统然后分别读取它们并将它们放在地址空间的不同部分中。

类 Unix 系统和 Windows 之间的细节和术语不同,但原理是相同的。


1. 是的,写时复制也允许共享数据。

于 2013-04-03T18:29:08.983 回答