是否可以保护视图(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;
}
答案 0 :(得分:1)
现代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包含相同指针的方式相同。