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两个进程共享物理页