内存映射文件,保护单个视图不被覆盖

Memory-Mapped Files, protecting individual view from overriding

本文关键字:视图 覆盖 单个 保护 映射 文件 内存      更新时间:2023-10-16
  • 是否可以保护视图(pMap,pMap2)数据不相互覆盖?

  • 还是我需要手动完成?

例如,当我执行代码时,文件数据将全部为"1"。

源代码

#include <Windows.h>
#include <iostream>
using namespace std;
int main()
{
    SYSTEM_INFO systemInfo;
    GetSystemInfo(&systemInfo);
    HANDLE hFile = CreateFile("temp", GENERIC_EXECUTE | GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    // error check
    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_EXECUTE_READWRITE, 0, systemInfo.dwAllocationGranularity*2, "awMapMemory");
    // error check
    LPVOID pMap = MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, systemInfo.dwAllocationGranularity);
    LPVOID pMap2 = MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, systemInfo.dwAllocationGranularity, systemInfo.dwAllocationGranularity);
    // error check
    __try
    {
        for(int i = 0; i < systemInfo.dwAllocationGranularity; i++)
            *((char*)pMap2 + i) = 2;
        for(int i = 0; i < systemInfo.dwAllocationGranularity + systemInfo.dwAllocationGranularity; i++)
            *((char*)pMap + i) = 1;
        FlushViewOfFile(pMap, 0);
    }
    __except (GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
        // error
    }
    UnmapViewOfFile(pMap);
    CloseHandle(hMap);
    CloseHandle(hFile);
    return 0;
}

现代CPU有一个MMU。此设备将程序看到的地址转换为硬件看到的地址。

示例:MMU 可以以 (char *)0x1000 实际访问地址0x12345000而不是0x1000的方式进行编程。

以这种方式使用 MMU 对于现代操作系统的内存管理绝对是必不可少的!

当你以你的方式使用MapViewOfFile时,MMU将被编程为pMap和pMap2转换为相同的硬件地址。举个例子:

pMap = (char *)0x1000 -> Hardware address 0x12345000
pMap2 = (char *)0x2000 -> Also hardware address 0x12345000

这意味着 pMap 和 pMap2 实际上指向同一个地址(这里0x12345000)。因此,程序的行为方式必须与 pMap 和 pMap2 包含相同的指针相同。