windows内存管理
1、虚拟内存:每个进程都有自己独立的4G的假的内存空间,当程序真正使用的时候操作系统才会分配对应的物理内存
X86架构下将物理内存按页(page)来分,一页4K
物理内存和内存条之间还有一层映射,此处不表。
2、虚拟内存的划分
进程空间
3、用户空间线性地址的管理
4、物理内存
5、私有内存(Private Memory)和共享内存
物理页只为某个进程所有,其他进程访问不到。用VirtualAlloc/VirtualAllocEx申请。
Mapped Memory
物理页为多个进程共享。用CreateFileMapping申请。
HANDLE CreateFileMapping(
HANDLE hFile, //要关联的文件句柄,为-1时关联物理页
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,//安全描述符,一般设置为NULL
DWORD flProtect, //保护模式
DWORD dwMaximumSizeHigh, //高32位,32位系统用不到
DWORD dwMaximumSizeLow, //低32位,指定物理内存/文件大小
LPCSTR lpName //内核对象的名字
);
A进程
#include <stdio.h> #include<windows.h> #define MapFileName "MapFileName" #define BUF_SIZE 0x1000 HANDLE g_hMapFile; LPTSTR g_lpBuff; int main() { getchar(); OpenFileMapping //创建内核对象:物理页 g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, (LPCWSTR)MapFileName); //将物理页与线性地址进行映射 g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile, FILE_MAP_WRITE, 0, 0, BUF_SIZE); DWORD eror = GetLastError(); *(PDWORD)g_lpBuff = 0x12345678; printf("%p", g_lpBuff);
getchar(); //关闭映射 UnmapViewOfFile(g_lpBuff); //关闭句柄 CloseHandle(g_hMapFile); getchar(); return 0;
} |
B进程
//创建内核对象:物理页,用OpenFileMapping也可以 g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, (LPCWSTR)MapFileName); //将物理页与线性地址进行映射 g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile, FILE_MAP_WRITE, 0, 0, BUF_SIZE); DWORD eror = GetLastError(); |
以上就实现了AB两个进程共享物理页