windows学习笔记之探索虚拟内存

一、 获取系统信息

我们可以调用系统信息获取函数来获得本系统的页面大小、分配粒度的大小等信息。

系统信息获取函数:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值