0

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

在每一个之上,我可以理解它是什么,在加载程序时,节被放置在磁盘中,而段被放置在内存中。而当程序开始运行时,Initialized data、BSS、Heap segment都被放入Data segment中,下表描述了更多细节:

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

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

4

2 回答 2

1

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

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

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

于 2013-02-07T12:19:50.093 回答
0

In the memory no difference.

But, usually they have separated caches. Also, in the virtual memory table, code segment is marked as such, so trying to execute something that is not code segment will crash the program.

Note that this actually vary from platform to platform.

于 2013-02-07T03:15:18.310 回答