如何将char []加载到DLL中的内存中

时间:2013-11-17 01:05:51

标签: c shared-libraries

我使用unsigned char []变量将二进制数据(pdf文档)嵌入到共享库中。也就是说,我有一个C文件包含这样的内容:

unsigned char large_data [] = {0x24,0x23 ...}; int sizeofLargeData = sizeof(large_data);

大数据可以是多兆字节。我的问题是,当应用程序加载共享库时,这些数据是否已加载到内存中?

1 个答案:

答案 0 :(得分:2)

当应用程序加载共享库时(通过Windows上的隐式依赖项或对LoadLibrary()的显式调用或POSIX系统上的dlopen(3)),加载程序映射将整个DLL的内容(其可执行代码及其全局变量段)放入进程虚拟地址空间的内存中,但不会通过从磁盘读取数据立即加载所有数据。

Windows,Linux和Mac OS X等现代操作系统使用demand paging加载模块。这意味着在访问数据之前,数据实际上并未从磁盘读取。当您访问尚未加载的页面上的数据时(例如,通过首次调用导出的函数或通过首次从模块访问全局变量),将生成页面错误异常。操作系统处理页面错误,从磁盘加载相应的代码或数据,然后从故障位置恢复程序;由于数据现已加载,程序在恢复时不再出现页面错误。

因此,如果共享对象中有数兆字节的数据且程序从不访问它,则永远不会支付必须从磁盘加载这些兆字节的I / O成本。它仍然在技术上映射到内存 - 您可以随时访问它而无需任何系统调用 - 但数据实际上并未从磁盘上读取。