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

时间:2013-10-10 17:09:28

标签: c++ operating-system memory-mapped-files virtual-address-space

好。我对memory mapped file中使用的virtual address spaces概念感到困惑。

在以下链接中,我用Google搜索。

http://en.wikipedia.org/wiki/Virtual_address_space

我找到了 部分

           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.

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

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

1 个答案:

答案 0 :(得分:3)

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

这种方式的工作原理是内存管理单元(MMU)生成一个CPU异常,导致执行跳转到内核错误处理程序。在访问冲突的情况下,您的流程将被终止。

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

当你mmap一个文件时,内核有效地执行请求分页,但是从你读取的指定文件而不是交换文件。这个过程完全一样。 CPU访问异常将导致文件中的数据被读入RAM,您可以将其作为普通内存访问。关闭文件时,内存将被写回已解除分配的文件中。最大的好处是你可以使用指针来使用文件中的数据。

希望这有帮助