C++ 在虚拟地址空间中使用内存映射文件

C++ 在虚拟地址空间中使用内存映射文件,c++,operating-system,memory-mapped-files,virtual-address-space,C++,Operating System,Memory Mapped Files,Virtual Address Space,嗯。我对虚拟地址空间中使用的内存映射文件的概念非常困惑 在下面的链接中,我用谷歌搜索了一下 我找到了一个部分 现在,这个内存映射文件与特定虚拟地址空间中的特定进程有什么关系(在上一节的最后一句中有点混淆) 为什么明确需要包含创建与特定进程对应的内存映射文件的代码?首先需要了解的是物理地址和虚拟地址之间的区别。当您的程序将数据写入特定(虚拟)内存地址时,写入的地址将转换为RAM芯片上的实际地址。如果没有为特定虚拟地址编程物理地址,通常会出现访问冲突或分段错误 其工作方式是内存管理单元(MMU)生

嗯。我对
虚拟地址空间中使用的
内存映射文件
的概念非常困惑

在下面的链接中,我用谷歌搜索了一下

我找到了一个部分

现在,这个内存映射文件与特定虚拟地址空间中的特定进程有什么关系(在上一节的最后一句中有点混淆)


为什么明确需要包含创建与特定进程对应的内存映射文件的代码?

首先需要了解的是物理地址和虚拟地址之间的区别。当您的程序将数据写入特定(虚拟)内存地址时,写入的地址将转换为RAM芯片上的实际地址。如果没有为特定虚拟地址编程物理地址,通常会出现访问冲突或分段错误

其工作方式是内存管理单元(MMU)生成CPU异常,导致执行跳转到内核故障处理程序。在访问冲突的情况下,进程将终止

内核能够做一些其他聪明的事情。如果进程空闲,它可能会将进程使用的一些物理内存复制到交换文件中(并从mmu中删除条目),当您访问所述地址时,CPU异常不会中止程序。相反,内核将首先挂起进程。然后将数据从交换文件复制回内存,重新编程MMU。然后内核将恢复您的进程,进程将访问内存,就像它一直在那里一样。就这个过程而言,没有发生什么特别的事情。这个过程称为请求分页

当您
mmap
一个文件时,内核将有效地执行请求分页,但它是从您读取的指定文件而不是从交换文件执行的。过程完全相同。CPU访问异常将导致文件中的数据被读取到RAM中,而RAM是作为正常内存访问的。当您关闭该文件时,内存会被写回被释放的文件中。最大的优点是您可以使用文件中的数据和指针


希望这有帮助

它描述了如何使用内存映射将运行的可执行文件的代码加载到内存中。
           Then the application's executable file is mapped into the Virtual Address Space. 
           Addresses in the process VAS are mapped to bytes in the exe file. 
           The OS manages the mapping:

                   0                                            4GB
         VAS        |---vvvvvvv------------------------------------|
         mapping        |-----|
         file bytes     app.exe

        The v's are values from bytes in the mapped file.