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

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

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

在下面的链接中我用谷歌搜索过。

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,您可以像普通内存一样访问 RAM。当您关闭文件时,内存将被写回已释放的文件中。最大的优点是您可以通过指针使用文件中的数据。

希望这有帮助

关于c++ - 在虚拟地址空间中使用内存映射文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19302039/

相关文章:

c++ - 有什么理由不使用全局 lambda 表达式?

c++ - 在一定秒数内更改缓冲区大小

c - 从 FAT12 查找可用软盘空间

memory - 操作系统在内存中的位置

c# - 内存映射文件 .NET

python - 使用 mmap 增加文件大小

c++ - 窗口系统如何通知QApplication?

c++ - Std::vector 被初始化为垃圾。奇怪的行为。有什么想法吗?

user-interface - 适用于 Windows/Linux 桌面的 Vimium 概念

c++ - 在 Qt5/C++ 中向后查找文本文件(tail a file)