我想了解当真正从调试器中读取这样一个函数位于地址0xsuchandsuch
,即变量foo
时, 意味着什么地址0xfoosaddress
指向地址0xpointedmemory
的内存区域,依此类推。
哪里可以找到有关如何从C编译的程序组织内存的资源?它是特定于编译器的吗?平台特定吗
答案 0 :(得分:1)
通常,平台(CPU和操作系统的组合)决定了内存的管理方式。编译器必须遵守平台设置的规则。这些通常在称为ABI(应用程序二进制接口)的东西中指定。对于Solaris(大多数也适用于其他类UNIX系统),您可以从Peter van der Linden的“Expert C Programming”一书中学到很多东西。
答案 1 :(得分:0)
纯粹是实现定义(编译器和平台特定) 标准没有谈及它只是说明所需行为的任何存储区域。
通常(再次实现具体实现),编译的c程序将被组织到不同的存储区域中。
通过 Ryndall hyde编写优秀代码第1卷 将这些部分分类为以下实现之一: / p>
答案 2 :(得分:0)
对于英特尔机器,您可以从头开始:8086
答案 3 :(得分:0)
我想说你可以将计算机分为两类:
1)小型系统,就像今天的嵌入式系统一样(尽管许多桌面计算机过去看起来像这样,但在当时)。只有一个大的内存范围,当链接器显示它位于特定地址时,它实际上存储在那里。
2)具有内存管理系统的大系统。在这些系统中,每个进程都显示一个看起来像完整内存范围的视图,但它使用的地址可能与实际内存的物理地址不对应。此外,部分内存可以交换到磁盘,然后在另一个物理地址重新读取。这就是为什么人们经常谈论位置而不是地址的原因之一。
我建议您从一个简单的编译器开始,为简单的编译器,看看它输出什么。例如,您可以使用嵌入式处理器MSP430,以及IAR编译器的免费Kickstart版本。该手册描述了如何组织内存以及如何执行启动过程等。