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

标签 c linux windows macos assembly

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

最佳答案

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

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

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

关于c - 启动时是否将整个静态程序加载到内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31722881/

相关文章:

linux - 获取在其他机器上运行的最后一个命令的PID

c - W32文本框自动换行

C 可以作为混合语言实现吗?

c++ - C/C++ 中某些头文件中的 sys/type.h

linux - Gnome-terminal:重置键盘快捷键

windows - WP7知道在 "navigated to"页面按下后退键

java - Windows 是否有唯一的 key /指纹,在重新安装后不会消失?

改变缓冲区溢出函数的返回值

c - 单链单词列表

linux - 如何通过ftp在远程之间传输文件?