一、 获取系统信息
我们可以调用系统信息获取函数来获得本系统的页面大小、分配粒度的大小等信息。
系统信息获取函数:
VOID GetSystemInfo(LPSYSTEM_INFO psinf);
参数类型:
LPSYSTEM_INFO psinf 用于返回系统信息的数据结构
所包含信息:
dwPageSize:CPU页面的大小
lpMinimumApplicationAddress:进程可用的地址空间中的最小地址
lpMaximumApplicationAddress:进程可用的地址空间中的最大地址
dwAllocationGranularity:保留的地址空间区域的分配粒度
dwNumberOfProcessors:计算机中CPU的数目
dwActiveProcessorMask:用于指明那个CPU是活动的
wProcessorArchitecture:处理器结构
wProcessorLevel:更详细的处理器结构
wProcessorRevision:更详细的处理机级别
验证程序:
#include <iostream> #include <windows.h> using namespace std; void main() { /*获取进程信息*/ LPSYSTEM_INFO systemInfo = new SYSTEM_INFO(); GetSystemInfo(systemInfo); cout << "Page Size :" << systemInfo->dwPageSize << endl; cout << "Allocation Granularity : " << systemInfo->dwAllocationGranularity << endl; cout << "Minimum application address : " << systemInfo->lpMinimumApplicationAddress << endl; cout << "Maxmum application address : " << systemInfo->lpMaximumApplicationAddress << endl; cout << "Number of processors : " << systemInfo->dwNumberOfProcessors << endl; cout << "Active processor mask : " << systemInfo->dwActiveProcessorMask << endl; cout << "Processor architecture : " << systemInfo->wProcessorArchitecture << endl; cout << "Processor level : " << systemInfo->wProcessorLevel << endl; cout << "Processor revision : " << systemInfo->wProcessorRevision << endl; cout << endl; system("pause"); }
输出结果:
Page Size :4096
Allocation Granularity : 65536
Minimum application address : 00010000
Maxmum application address : 7FFEFFFF
Number of processors : 2
Active processor mask : 3
Processor architecture : 0
Processor level : 6
Processor revision : 3846
二、 查看虚拟内存状态
我们可以通过相关函数检索当前内存状态的动态信息。
获取函数:
GlobalMemoryStatus(LPMEMORYSTATUS pmst); /*内存小于4G*/
GlobalMemoryStatusEx(LPMEMORYSTATUSEX pmst); /*内存大于4G或合计交换文件大小大于4G*/
函数参数:
LPMEMORYSTATUS pmst:用于返回信息的数据结构
LPMEMORYSTATUSEX pmst:用于返回信息的数据结构
包含信息:
dwLength:参数结构体的字节数
dwTotalPhys:物理存储器的总字节数
dwAvailPhys:可供分配的物理存储器的总字节数
dwTotalPageFile:硬盘上调页文件中包含的最大字节数
dwAvailPageFile:调页文件中尚未提交给任何进程的总的字节数
dwTotalVirtual:每个近处的地址空间中私有的总字节数
dwAvailVirtual:当前进程中所有空闲区域的总和
验证程序:
#include <iostream> #include <windows.h> using namespace std; void main() { /*获取虚拟内存状态*/ LPMEMORYSTATUS memoryStatus = new MEMORYSTATUS(); memoryStatus->dwLength = sizeof(MEMORYSTATUS); GlobalMemoryStatus(memoryStatus); cout << "memoryStatus" << endl; cout << "MemoryStatus length : " << memoryStatus->dwLength << endl; cout << endl; cout << "Total Phys : " << memoryStatus->dwTotalPhys << endl; cout << "Avail Phys : " << memoryStatus->dwAvailPhys << endl; cout << endl; cout << "Total Page File : " << memoryStatus->dwTotalPageFile << endl; cout << "Avail Page File : " << memoryStatus->dwAvailPageFile << endl; cout << endl; cout << "Total Virtual : " << memoryStatus->dwTotalVirtual << endl; cout << "Avail Virtual : " << memoryStatus->dwAvailVirtual << endl; cout << endl; cout << "memoryStatusEx" << endl; /*获取内存大于4G,或者合计交换文件的大小大于4G情况下的虚拟内存状态*/ LPMEMORYSTATUSEX memoryStatusEx = new MEMORYSTATUSEX(); memoryStatusEx->dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(memoryStatusEx); cout << "MemoryStatus length : " << memoryStatusEx->dwLength << endl; cout << endl; cout << "Total Phys : " << memoryStatusEx->ullTotalPhys << endl; cout << "Avail Phys : " << memoryStatusEx->ullAvailPhys << endl; cout << endl; cout << "Total Page File : " << memoryStatusEx->ullTotalPageFile << endl; cout << "Avail Page File : " << memoryStatusEx->ullAvailPageFile << endl; cout << endl; cout << "Total Virtual : " << memoryStatusEx->ullTotalVirtual << endl; cout << "Avail Virtual : " << memoryStatusEx->ullAvailVirtual << endl; cout << "Avail Extended Virtual : " << memoryStatusEx->ullAvailExtendedVirtual << endl; system("pause"); }
输出结果:
memoryStatus
MemoryStatus length : 32
Total Phys : 2147483647
Avail Phys : 2147483647
Total Page File : 4294967295
Avail Page File : 3689095168
Total Virtual : 2147352576
Avail Virtual : 2140684288
memoryStatusEx
MemoryStatus length : 64
Total Phys : 3218522112
Avail Phys : 2473451520
Total Page File : 4421079040
Avail Page File : 3689095168
Total Virtual : 2147352576
Avail Virtual : 2140684288
Avail Extended Virtual : 0
三、 确定地址空间的状态
我们可以通过调用相应函数来确定地址空间真能干内存地址的大小、存储器类型、保护属性等信息。
获取地址空间状态的函数:
VirtualQuery(LPCVOID pvAddr, PMEMORY_BASIC_INFORMATION pmbi, DWORD dwLength);
函数参数:
LPCVOID pvAddr:指针类型,包含需要查询其信息的内存地址
PMEMORY_BASIC_INFORMATION pmbi:用于返回信息的数据结构
DWORD dwLength:用于设定EMORY_BASIC_INFORMATION结构大小
包含信息:
BaseAddress:经过四舍五入的页面边界值
AllocationBase:包含pvAddress参数中舍得的地址区域的基地址
AllocationProtect:该地址空间区域初次保留时的保护属性
Protect:该区域的保护属性,包括(R E W)
State:所有相邻页面的状态,包括自由(MEM_FREE)、保留(MEM_RESERVE)、提交(MEM_COMMIT)
Type:所有相邻页面的存储类型,包括映像(MEM_IMAGE)、映射(MEM_MAPPED)、私有(EM__PRIVATE)
注:私有受系统页文件的支持,映像受内存映射的映像文件支持(exe/dll)。
验证程序:
#include <iostream> #include <windows.h> using namespace std; void main() { /*获取地址空间的状态*/ PMEMORY_BASIC_INFORMATION memoryBasicInfo = new MEMORY_BASIC_INFORMATION(); PVOID addr = NULL; /*作为指针变量单独使用,此处不需与其他地址绑定*/ cout << "Virtual Memory Status" << endl; while(true) { VirtualQuery((void *)addr, memoryBasicInfo, sizeof(MEMORY_BASIC_INFORMATION)); cout << memoryBasicInfo->BaseAddress << "/t" << memoryBasicInfo->AllocationBase << "/t" << memoryBasicInfo->RegionSize << "/t" ; switch(memoryBasicInfo->State) { case MEM_FREE: { cout << "free"; break; } case MEM_RESERVE: { cout << "reserve"; break; } case MEM_COMMIT: { cout << "commit"; break; } } cout << "/t"; switch(memoryBasicInfo->AllocationProtect) { case PAGE_NOACCESS: { cout << "N"; break; } case PAGE_READONLY: { cout << "R"; break; } case PAGE_EXECUTE: { cout << "E"; break; } case PAGE_EXECUTE_READ: { cout << "ER"; break; } case PAGE_EXECUTE_READWRITE: { cout << "ERW"; break; } } cout << "/t"; switch(memoryBasicInfo->Protect) { case PAGE_NOACCESS: { cout << "N"; break; } case PAGE_READONLY: { cout << "R"; break; } case PAGE_EXECUTE: { cout << "E"; break; } case PAGE_EXECUTE_READ: { cout << "ER"; break; } case PAGE_EXECUTE_READWRITE: { cout << "ERW"; } } cout << "/t"; switch(memoryBasicInfo->Type) { case MEM_IMAGE: { cout << "image"; break; } case MEM_MAPPED: { cout << "mapped"; break; } case MEM_PRIVATE: { cout << "private"; break; } } cout << endl; if((int)memoryBasicInfo->BaseAddress + memoryBasicInfo->RegionSize >= 0x7FFF0000) { break; } addr = ((PBYTE)memoryBasicInfo->BaseAddress + memoryBasicInfo->RegionSize); } system("pause"); }
输出结果:
Virtual Memory Status
00000000 00000000 65536 free N
00010000 00010000 12288 commit private
00013000 00000000 53248 free N
00020000 00020000 4096 commit private
00021000 00000000 61440 free N
00030000 00030000 1036288 reserve private
0012D000 00030000 4096 commit private
0012E000 00030000 8192 commit private
00130000 00130000 12288 commit R R mapped
00133000 00000000 53248 free N
00140000 00140000 12288 commit private
00143000 00140000 1036288 reserve private
00240000 00240000 24576 commit private
00246000 00240000 40960 reserve private
00250000 00250000 12288 commit mapped
00253000 00250000 53248 reserve mapped
00260000 00260000 90112 commit R R mapped
00276000 00000000 40960 free N
00280000 00280000 266240 commit R R mapped
002C1000 00000000 61440 free N
002D0000 002D0000 266240 commit R R mapped
00311000 00000000 61440 free N
00320000 00320000 24576 commit R R mapped
00326000 00000000 40960 free N
00330000 00330000 266240 commit R R mapped
00371000 00000000 61440 free N
00380000 00380000 16384 commit private
00384000 00380000 49152 reserve private
00390000 00390000 12288 commit R R mapped
00393000 00000000 446464 free N
00400000 00400000 4096 commit R image
00401000 00400000 102400 commit image
0041A000 00400000 229376 commit ER image
00452000 00400000 28672 commit R image
00459000 00400000 4096 commit image
0045A000 00400000 20480 commit image
0045F000 00000000 2084179968 free N
7C800000 7C800000 4096 commit R image
7C801000 7C800000 540672 commit ER image
7C885000 7C800000 12288 commit image
7C888000 7C800000 8192 commit image
7C88A000 7C800000 606208 commit R image
7C91E000 00000000 8192 free N
7C920000 7C920000 4096 commit R image
7C921000 7C920000 499712 commit ER image
7C99B000 7C920000 12288 commit image
7C99E000 7C920000 8192 commit image
7C9A0000 7C920000 77824 commit R image
7C9B3000 00000000 47435776 free N
7F6F0000 7F6F0000 28672 commit ER ER mapped
7F6F7000 7F6F0000 1019904 reserve ER mapped
7F7F0000 00000000 8060928 free N
7FFA0000 7FFA0000 208896 commit R R mapped
7FFD3000 00000000 20480 free N
7FFD8000 7FFD8000 4096 commit private
7FFD9000 00000000 24576 free N
7FFDF000 7FFDF000 4096 commit private
7FFE0000 7FFE0000 4096 commit R R private
7FFE1000 7FFE0000 61440 reserve R N private