启动时整个静态程序是否加载到内存中?

在Mac,Windows,Linux,iOS等典型的计算机上,当用户启动一个程序/二进制/应用程序时,程序的静态部分总是在执行开始之前全部加载到内存中? 这是否包括程序中的所有段/段数据,如string和其他embedded式BLOB数据? 比方说,我embedded一个巨大的图像文件到二进制文件(例如在__DATA段)。 这个图像数据是否会在启动时全部加载到内存中?

在OS X下,Windows,Linux和iOS可执行文件在执行时不会加载到RAM中。 而是将可执行文件映射到进程的虚拟地址空间。 当进程访问尚未加载到RAM中的可执行文件的映射页面时,CPU通过将该页面读入RAM,生成OS处理的页面错误。

所以,如果你把一个巨大的图像文件放在你的可执行文件的数据部分,它将不会被加载到内存中,直到你的程序第一次访问它。 一个巨大的图像文件可能需要多页的内存(通常是4K),所以如果你的程序只访问图像的一部分,只有部分图像将被加载到RAM中。

请注意,在Windows和其他操作系统下,有一个重要的例外。 在Windows下,称为预取程序的操作系统服务将开始预加载到内存中预测程序在启动期间将访问的任何文件的部分。 它使这些预测基于记录的以前运行程序的启动访问模式。 由于“任何文件”都包含可执行文件本身以及它所使用的任何DLL或数据文件,这意味着当进程启动时,可执行文件的一部分将被预加载到RAM中。 这也意味着,如果程序通常在程序启动时显示一个大的图像(例如启动画面),那么预加载器将把图像加载到RAM中,无论它存储为可执行文件的一部分还是作为单独的数据文件。