【问题标题】:Is an entire static program loaded into memory when launched?启动时是否将整个静态程序加载到内存中?
【发布时间】:2015-10-21 18:11:41
【问题描述】:

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

【问题讨论】:

  • 在支持分页的系统上,通常几乎所有内容(包括程序)在按需时都会出现故障。

标签: c linux windows macos assembly


【解决方案1】:

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

因此,如果您将一个巨大的图像文件放入可执行文件的数据部分,则在您的程序第一次访问它之前,它不会被加载到 RAM 中。一个巨大的图像文件可能会占用多页内存(通常大小为 4K),因此如果您的程序只访问部分图像,则只有部分图像会被加载到 RAM 中。

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

【讨论】:

  • Windows 上还有另一个例外,如果在链接过程中设置了 /SWAPFILE 标志,则会提前读取整个可执行文件。通常用于旨在通过不可靠的网络或可移动媒体运行的可执行文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2018-01-07
  • 2021-04-14
  • 2014-02-10
  • 2012-05-07
相关资源
最近更新 更多