2010-05-04 48 views
3

我已阅读静态内存分配是在编译期间完成的。静态内存分配和可移植性

生成可执行文件时使用“地址分配”吗?现在

,我在怀疑是如何当代码可执行完全转移到新的系统内存分配进行处理。

我搜索了,但我没有得到互联网上的任何回答。

+1

您知道在现代计算机上,每个正在执行的进程都会看到一个新的地址空间,而与其他进程一直在做什么无关吗? (并且在允许这种MMU之前的时间,虽然虚拟内存和链接在技术上是两个分开的概念,但不需要一起加载),但将可执行文件始终加载在同一地址并不罕见。 – 2010-05-04 12:53:51

回答

3

嗯,这完全取决于你是否能执行新的系统上运行与否的情况。每个操作系统都定义了它自己的可执行文件格式。例如,here's windows exe的外观如何。有一个原因叫做便携式可执行文件

当你的编译器生成这样的可执行文件,它首先编译的C代码到目标结构的相应组件,然后将其打包到目标可执行文件格式。静态内存分配以这种格式找到它们的位置。

你能想象的exe文件作为那种被加载到操作系统加载过程中一个新的内存空间中的内存映像。操作系统保持到该位置的偏移量,并确保所有程序的内存访问进入其进程的受保护地址空间。

为了回答您的具体问题:同样的操作系统的系统和体系结构之间传送可执行通常是没有问题的。操作系统通过模拟可以处理相同操作系统但不同机器架构的情况(例如,Mac OS的Rosetta模拟x86上的PowerPC)。 64/32位兼容性也是这样处理的。在不同的操作系统之间传输通常是不可能的(对于本机可执行文件),但是在虚拟机(java vm,.net CLR)中运行的所有内容都不成问题,因为进程加载器只加载虚拟机,并从那里运行实际程序。

+0

你能解释一下“相同的操作系统,但不同的机器架构”的情况....?那种情况下的机制究竟是什么? – 2010-05-04 14:50:15

+1

A:PowerPc(老mac)或Intel(新Macs)上的MacOS。在新的intel mac上,旧的PowerPC代码可以通过仿真PowerPC CPU运行。 B:Windows和x86-64(32位/ 64位):通过提供可用32位指针寻址的虚拟地址空间,保持向后兼容32位代码。 – 2010-05-04 15:00:48