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



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

在下面的链接中,我已经用谷歌搜索了。

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.

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

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

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

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

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

当您mmap文件时,内核正在有效地执行需求分页,但来自您读取的指定文件,而不是来自交换文件。过程完全相同。CPU 访问异常将导致文件中的数据被读入您作为正常内存访问的 RAM。关闭文件时,内存将写回已解除分配的文件。最大的优势是您可以使用带有指针的文件中的数据。

希望这有帮助

最新更新