【问题标题】:Who arranges/creates the different segments(stack,heap,code segment, data segment) of a program谁安排/创建程序的不同段(堆栈、堆、代码段、数据段)
【发布时间】:2015-07-01 03:21:07
【问题描述】:

在浏览程序的不同部分时,我对谁创建这些部分有些怀疑。 我的理解是汇编程序在创建汇编代码时创建不同的段,当加载到虚拟内存中时,加载程序为所有段创建虚拟地址空间并将它们存储在虚拟内存中。

请帮助我理解它。

【问题讨论】:

  • 一般由编译器、汇编器、链接器和操作系统共同完成。但它也很大程度上取决于目标,例如对于没有操作系统或具有小型实时操作系统的嵌入式系统,它可以部分由编译器/汇编器完成,最后由链接器分段。
  • 没那么简单。你告诉编译器你的目标和内存模型是什么(即使你只是接受默认值)。然后,您的编译器会创建符合在给定目标和内存模型中编译的程序类型的段。默认情况下,你一般会得到一个数据段、rodata段、bss段、代码段、堆栈段,你还会得到额外的内存段f&g。限制是预定义的。如果你用大内存模型改变你的编译目标,那也会改变。

标签: linux memory-management assembly


【解决方案1】:

是的,汇编器生成单独的段,但是您在代码中使用标签指定它们,例如 .data 指令告诉汇编器我们已经到达数据段。

【讨论】:

  • 如果使用gcc/gas,您是说gas 决定了段布局而不是gcc
  • 不,我将其专门解释为编写原始汇编程序。如果使用高级语言,我的回答不适用。
【解决方案2】:

编译器将程序的可执行语句翻译成 CPU 指令,静态数据的声明被翻译成机器特定的数据规范。为了创建可执行文件,系统链接器将指令和数据聚合到不同的段中。所有的指令都进入一个传统上称为文本的段。同时,数据被安排在两个段中。一种称为data,用于已初始化的静态数据和字面常量,另一种称为bss,用于未初始化的静态数据。

http://www.ualberta.ca/CNS/RESEARCH/LinuxClusters/mem.html

描述所有涉及的内存管理过程的好网站。

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 2011-09-06
    • 1970-01-01
    • 2017-02-23
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    相关资源
    最近更新 更多