繁体   English   中英

代码、静态、堆栈和堆段实现

[英]Code, static, stack and heap segments implementation

我知道每个段的目的,但我想知道真正用 c 或 c++ 等语言实现它们?

它们是由 c/c++ 编译器程序员在编写语言实现时编写的吗? 或者这些段是在操作系统/硬件级别实现的(也许当操作系统为程序选择地址空间时)?

我把堆栈帧想象成一个简单的 c 结构,它在每次函数调用时都被推入堆栈。 我把堆想象成一个动态数组等等......

这有点粗略 - 硬件架构、内存模型等都会影响 C/C++ 实现可能具有“段”特征的方式。 较旧的 CPU 有局限性,导致一组更复杂的“段”(iAPX 286 - 还记得吗?)

目标代码包含由可执行语句产生的代码:由汇编机器指令产生的字节。 这将进入一个代码段,这将(通常)导致一个被写保护的内存段。

目标代码包含数据:由汇编数据定义语句产生的字节,带有一些初始化(或默认值,在 C/C++ 的情况下为零),这将进入数据段,没有访问限制。

CPU 的工作方式需要一个堆栈:将返回地址推送到堆栈上,通过推送函数参数也是最有效的参数传递约定。 “堆栈帧”部分是“按照惯例”,但通常它由返回地址和参数组成; 为局部变量保留了额外的空间:每个实例化一组(如果函数是递归的,这很重要)。

堆只是一个内存区域,从中提供分配(malloc,new)。 它通常分配在代码和数据段之外。 堆栈可能会从堆中取出 - 这取决于您是否只有一个堆栈段或多个(想想线程)。

此外,请注意有几种目标代码“格式”或“语言”,即这些段在目标代码中的定义方式。 这取决于系统的加载程序可以处理的内容:一种此类格式称为“a.out”,另一种称为“ELF”。 编译器必须遵守格式和可能性。

它们是由 c/c++ 编译器程序员在编写语言实现时编写的吗? 或者这些段是在操作系统/硬件级别实现的(也许当操作系统为程序选择地址空间时)?

段入口点主要在工具链的链接阶段(和链接程序)进行管理。

从这个意义上说,是的,这些是由编译器开发人员实现的。

不过,您可以提供自己的链接器脚本,您可以在其中指定这些段应出现在哪些具体内存地址,以及这些内存地址是指 ROM 还是 RAM。

我把堆栈帧想象成一个简单的 c 结构,它在每次函数调用时都被推入堆栈。 我把堆想象成一个动态数组等等......

恐怕这根本没有那么简单

  • 堆栈帧通常还需要跟踪本地实例化的变量、异常堆栈展开所需的信息等。
  • 堆分配的内存需要一些基本机制来跟踪分配的内存块及其实际大小。
  • 静态内存初始化和类初始化需要运行静态实例化类的构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM