地址空间段和内存中的程序存储器段有什么区别?

时间:2013-02-07 02:22:58

标签: c memory

1,可执行文件中有.text,.data,.bss等部分 2,还有程序存储器段(代码,初始化数据,未初始化数据(BSS),堆,堆栈),可以从可执行文件中的部分进行映射。

在每个上面,我可以理解它是什么,当程序加载时段被放置在磁盘中而段被放入内存中。当程序开始运行时,初始化数据,BSS,堆段都被放入数据段,下表描述了更多细节:

此表引自http://www.tenouk.com/ModuleW.html表w.6:

Table w.6 我的问题是内存中地址空间段程序内存段的区别是什么?

2 个答案:

答案 0 :(得分:1)

它们只是在内存中引用相同段的不同方式..

  • “代码” - 或“文本” - 段是从可执行文件的.text部分加载的,加载它的内存页面标记为可执行文件。
  • 程序地址空间的“数据”部分包含3个不同的逻辑部分:
    • 初始化数据(从可执行文件的.data部分加载)
    • 未初始化的数据 - 可执行文件的.bss部分记录了要分配的大小,但没有实际内容(毕竟,它未被初始化!)
    • 动态分配的数据(堆) - 在程序运行时分配,因此在可执行文件中没有或不需要匹配的部分 所有这些数据部分的内存页面都是可读/写的,理论上也是不可执行的。
  • “堆栈”部分 - 本质上类似于数据类型部分,但在执行程序时具有特殊含义/目的。也没有可执行文件中的部分支持。

处理这些部分/段的确切方式显然是特定于实现的 - 文件的布局取决于所使用的特定可执行格式和链接器,并且内存中程序的布局再次取决于可执行格式利用和OS加载器。作为一个例子,根据对PE文件格式的讨论 - http://msdn.microsoft.com/en-us/library/ms809762.aspx - 其中一个Borland链接器用于从可执行文件中删除.bss部分,而是将其与.data部分组合 - 我怀疑根据所使用的OS / Linkers / Executable格式的不同风格,有许多类似变量的例子。

答案 1 :(得分:0)

在记忆中没有区别。

但是,通常他们有分开的缓存。此外,在虚拟内存表中,代码段被标记为这样,因此尝试执行非代码段的操作会使程序崩溃。

请注意,这实际上因平台而异。