内存

一、物理内存和虚拟内存

1、虚拟内存

  • 每个程序都有4G虚拟内存,相当于空头支票
  • 只有真正要用的时候,才会在物理内存中给你分配一块物理内存
  • 4kb页式管理,一页是4kb大小(物理页)

2、虚拟内存地址划分

3、物理内存

  • 内存条的大小(不一定能百分百识别全部大小,近似) + 虚拟内存(硬盘)
  • 32位系统最多可以识别物理内存为64G,但由于操作系统的限制,比如XP,只能识别4G(Windows 2003服务器版本 可以识别4G以上)

二、私有内存申请和释放

1、申请

#include "stdafx.h"

int main(int argc , char* arvc[])
{

	LPVOID p =  VirtualAlloc(
			NULL,                // 要分配的内存区域的地址(一般为NULL)
			1000*2,              // 分配物理页的大小(按物理页的整数倍分,10进制4096,16进制1000)
			MEM_COMMIT,          // 分配的类型(MEM_RESERVE,占用虚拟地址,不需要物理内存,MEM_COMMIT,占用虚拟地址,也需要使用物理页)
			PAGE_READWRITE       // 该内存的初始保护属性(读写)
	);
	return ;
}

2、释放

#include "stdafx.h"

int main(int argc , char* arvc[])
{

	LPVOID p =  VirtualAlloc(
			NULL,                // 要分配的内存区域的地址(一般为NULL)
			1000*2,              // 分配物理页的大小(按物理页的整数倍分,10进制4096,16进制1000)
			MEM_COMMIT,          // 分配的类型(MEM_RESERVE,占用虚拟地址,不需要物理内存,MEM_COMMIT,占用虚拟地址,也需要使用物理页)
			PAGE_READWRITE       // 该内存的初始保护属性(读写)
	);

	VirtualFree(
		p,                // 区域地址
		0x1000*2,         // 物理页的大小,字节
		MEM_DECOMMIT      // 类型(MEM_DECOMMIT,虚拟地址保留,不保留物理页,MEM_RELEASE ,虚拟地址不保留,物理页也不保留)
		);

	return ;
}

3、malloc是从已经分配好的一块内存中挖出一块给自己用,本质上分配内存的不是它

三、共享内存申请和释放

A进程:

#include "stdafx.h"
#include "windows.h"

#define MapFileName "ZZZ" 
#define BUFSIZE 0x1000
HANDLE g_hMapFile;
LPTSTR g_lpBuff;

int main(int argc, char* argv[])
{
	
	//内核对象,创建物理页
	g_hMapFile = CreateFileMapping(
		INVALID_HANDLE_VALUE,	// 为INVALID_HANDLE_VALUE时,不与文件关联
		NULL,					// 安全描述符
		PAGE_READWRITE,			// 保护模式(读写的权限)
		0,						// 32位通常为空
		BUFSIZ,					// 物理页的大小
		MapFileName				// 指定文件映射对象的名字
		);

	
	//将物理页与线性地址进行映射,g_lpBuff就是虚拟内存地址
	g_lpBuff = (LPTSTR)MapViewOfFile(
		g_hMapFile,				//句柄
		FILE_MAP_ALL_ACCESS,	//虚拟内存读写权限
		0,						//32位用不上
		0,						//从哪开始映射
		BUFSIZ					//物理页多大它就多大
		);


	DWORD eror = GetLastError();
	*(PDWORD)g_lpBuff = 0x12345678;//往虚拟内存地址存值
	printf("%p",g_lpBuff);
	
	getchar();
	
	//关闭映射,物理页的计数器只会减一
	UnmapViewOfFile(g_lpBuff);
	//关闭句柄
	CloseHandle(g_hMapFile);
	getchar();
	return 0;
}

B进程:

#include "stdafx.h"
#include "windows.h"


#define MapFileName "ZZZ" 
#define BUFSIZE 0x1000
HANDLE g_hMapFile;
LPTSTR g_lpBuff;

int main(int argc, char* argv[])
{

	g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,BUFSIZ,MapFileName);
	//将物理页与线性地址进行映射,g_lpBuff就是虚拟内存地址
	g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile,FILE_MAP_ALL_ACCESS,0,0,BUFSIZ);

	printf("进程B:%x",*(PDWORD)g_lpBuff);
	//关闭映射
	UnmapViewOfFile(g_lpBuff);
	//关闭句柄
	CloseHandle(g_hMapFile);
	getchar();
	return 0;
}

posted @ 2021-12-24 11:56  lnterpreter  阅读(245)  评论(0)    收藏  举报