Linux 谁安排/创建程序的不同段(堆栈、堆、代码段、数据段)

Linux 谁安排/创建程序的不同段(堆栈、堆、代码段、数据段),linux,memory-management,assembly,Linux,Memory Management,Assembly,在浏览一个程序的不同部分时,我对谁创建了这些部分有些怀疑。 我的理解是,汇编程序在创建汇编代码时创建不同的段,而当加载到虚拟内存中时,加载程序为所有段创建虚拟地址空间,并将它们存储在虚拟内存中 请帮助我理解它 是的,汇编程序生成各个段,但您可以在代码中使用标签指定它们,例如.data指令告诉汇编程序我们已经到达了数据段。编译器将程序的可执行语句转换为CPU指令,静态数据的声明被转换为特定于机器的数据规范。要创建可执行文件,系统链接器将指令和数据聚合为不同的段。所有指令都进入传统上称为文本的一段。

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


请帮助我理解它

是的,汇编程序生成各个段,但您可以在代码中使用标签指定它们,例如.data指令告诉汇编程序我们已经到达了数据段。

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


描述所有内存管理过程的好站点。

通常由编译器、汇编程序、链接器和操作系统共同完成。但这也很大程度上取决于目标,例如,对于没有操作系统的嵌入式系统或具有小型实时操作系统的嵌入式系统,它可以部分由编译器/汇编器完成,最后由链接器进行分段。这并不是很简单。您可以告诉编译器您的目标和内存模型是什么,即使您只是接受默认值。编译器将创建符合在给定目标和内存模型中编译的程序类型的段。在默认情况下,通常会得到数据段、rodata段、bss段、代码段、堆栈段,还可以得到额外的内存段f&g。这些限制是预定义的。如果你改变了使用大内存模型编译的目标,那也会改变。如果使用gcc/gas,你是说gas决定了段布局而不是gcc吗?不,我把它解释为编写原始汇编程序。如果使用更高级的语言,我的答案不适用。