函数,函数参数和本地堆栈如何在内存中进行物理组织?

时间:2012-01-05 07:36:56

标签: c memory compiler-construction

我想了解当真正从调试器中读取这样一个函数位于地址0xsuchandsuch,即变量foo时, 意味着什么地址0xfoosaddress指向地址0xpointedmemory的内存区域,依此类推。

哪里可以找到有关如何从C编译的程序组织内存的资源?它是特定于编译器的吗?平台特定吗

4 个答案:

答案 0 :(得分:1)

通常,平台(CPU和操作系统的组合)决定了内存的管理方式。编译器必须遵守平台设置的规则。这些通常在称为ABI(应用程序二进制接口)的东西中指定。对于Solaris(大多数也适用于其他类UNIX系统),您可以从Peter van der Linden的“Expert C Programming”一书中学到很多东西。

答案 1 :(得分:0)

纯粹是实现定义(编译器和平台特定) 标准没有谈及它只是说明所需行为的任​​何存储区域。

通常(再次实现具体实现),编译的c程序将被组织到不同的存储区域中。

通过 Ryndall hyde

编写优秀代码第1卷 将这些部分分类为以下实现之一: / p>

  • 代码部分 - 保存程序机器说明
  • 常量部分 - 保存编译器生成的只读数据
  • 只读数据部分 - 保存只能读取,永不写入的用户定义数据
  • 静态部分 - 保存用户定义的初始化静态变量
  • BSS部分 - 保存用户定义的未初始化变量
  • Stack Section - 保存局部变量&其他临时数据
  • 堆部分 - 保存动态变量
  • 保留部分适用于O.S

答案 2 :(得分:0)

对于英特尔机器,您可以从头开始:8086

答案 3 :(得分:0)

我想说你可以将计算机分为两类:

1)小型系统,就像今天的嵌入式系统一样(尽管许多桌面计算机过去看起来像这样,但在当时)。只有一个大的内存范围,当链接器显示它位于特定地址时,它实际上存储在那里。

2)具有内存管理系统的大系统。在这些系统中,每个进程都显示一个看起来像完整内存范围的视图,但它使用的地址可能与实际内存的物理地址不对应。此外,部分内存可以交换到磁盘,然后在另一个物理地址重新读取。这就是为什么人们经常谈论位置而不是地址的原因之一。

我建议您从一个简单的编译器开始,为简单的编译器,看看它输出什么。例如,您可以使用嵌入式处理器MSP430,以及IAR编译器的免费Kickstart版本。该手册描述了如何组织内存以及如何执行启动过程等。