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

如何将char[]加载到DLL中的内存中,c,shared-libraries,C,Shared Libraries,我使用无符号char[]变量将二进制数据(pdf文档)嵌入到共享库中。也就是说,我有一个C文件,其中包含如下内容: 无符号字符大数据[]={0x24,0x23…}; int sizeofLargeData=sizeof(大数据) 大数据可以是许多兆字节。我的问题是,当应用程序加载共享库时,这些数据是否加载到内存中 当应用程序加载共享库时(在Windows或POSIX系统上通过隐式依赖项或显式调用),加载程序将DLL的全部内容(其可执行代码及其全局变量段)映射到进程虚拟地址空间中的内存中,但它不会

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

无符号字符大数据[]={0x24,0x23…}; int sizeofLargeData=sizeof(大数据)


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

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

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


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

谢谢,太好了。但是,您的答案是针对windows的。也许它在Linux和其他系统上也能起到类似的作用。@TotteKarlsson:出于某种原因,我认为最初的问题是专门针对Windows的,但显然不是。在任何情况下,答案对于任何支持按需分页的操作系统都是一样的,现代操作系统就是这样做的。