首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >地址空间段和程序内存段在内存中的区别是什么?

地址空间段和程序内存段在内存中的区别是什么?
EN

Stack Overflow用户
提问于 2013-02-07 02:22:58
回答 2查看 955关注 0票数 0

1在可执行文件中有.text、.data、.bss等部分。

2、,还有程序内存段(代码、初始化数据、未初始化数据、堆、堆栈),它们可以从可执行文件中的部分映射。

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2013-02-07 12:19:50

他们只是用不同的方式来指记忆中相同的片段。

  • “代码”或“文本”段从可执行文件的.text部分加载,加载到其中的内存页被标记为可执行文件。
  • 程序地址空间的“数据”部分包含三个不同的逻辑部分:
    • 初始化数据(从可执行文件的.data部分加载)
    • 未初始化的数据-可执行文件的.bss部分记录要分配的大小,但没有实际的内容(毕竟,它没有初始化!)
    • 动态分配的数据(堆)-它是在程序运行时分配的,因此在所有这些数据部分的可执行内存页中没有或不需要一个匹配的部分,而且理论上也是不可执行的。

  • “堆栈”部分--本质上类似于数据类型部分,但在执行程序时具有特殊的意义/目的。也没有由可执行文件中的节进行备份。

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

票数 1
EN

Stack Overflow用户

发布于 2013-02-07 03:15:18

在记忆中没有什么不同。

但是,通常他们有分开的缓存。此外,在虚拟内存表中,代码段被标记为代码段,因此尝试执行不属于代码段的内容将使程序崩溃。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14742493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档