【问题标题】:what is the difference of Address space segment and Program memory segment in memory?内存中的地址空间段和程序内存段有什么区别?
【发布时间】:2013-01-22 10:38:42
【问题描述】:

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

在每一个之上,我可以理解它是什么,当程序加载时,段放在磁盘中,而段放在内存中。当程序开始运行时,Initialized data,BSS,Heap segment都被放入Data segment中,具体如下表:

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

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

【问题讨论】:

  • 嗯,这不是一个可靠的(或有信誉的?)来源。

标签: c memory


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    在记忆中没有区别。

    但是,通常它们具有单独的缓存。另外,在虚拟内存表中,代码段是这样标记的,所以试图执行不是代码段的东西会导致程序崩溃。

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

    【讨论】:

    • 独立缓存 => 可能无法更改指令。一切因平台而异。
    • @Potatoswatter 对不起,我没听懂你所说的“可能无法更改指令”
    猜你喜欢
    • 2021-09-11
    • 2018-01-23
    • 1970-01-01
    • 2018-12-27
    • 2020-03-12
    • 2019-07-03
    • 2014-07-30
    • 2016-10-12
    • 2011-06-25
    相关资源
    最近更新 更多