Windows核心编程 第十四章 虚拟内存

1 4章 虚 拟 内 存

<这一章没啥,是说的几个内存相关的函数 >

14.1 系统信息

    许多操作系统的值是根据主机而定的,比如页面的大小,分配粒度的大小等。这些值决不应该用硬编码的形式放入你的源代码。相反,你始终都应该在进程初始化的时候检索这些值,并在你的源代码中使用检索到的值。G e t S y s t e m I n f o函数将用于检索与主机相关的值:VOID WINAPI GetSystemInfo(_Out_ LPSYSTEM_INFO lpSystemInfo);

必须传递S Y S T E M _ I N F O结构的地址给这个函数。这个函数将初始化所有的结构成员然后返回。下面是S Y S T E M _ I N F O数据结构的样子。


    当系统引导时,它要确定这些成员的值是什么。对于任何既定的系统来说,这些值总是相同的,因此决不需要为任何既定的进程多次调用该函数。由于有了 G e t S y s t e m I n f o函数,因此应用程序能够在运行的时候查询这些值。在该结构的所有成员中,只有 4个成员与内存有关。表1 4 - 1对这4个成员作了描述。


14.2 虚拟内存的状态

Wi n d o w s函数G l o b a l M e m o r y S t a t u s可用于检索关于当前内存状态的动态信息:

 

MEMORYSTATUS mst = {sizeof(mst)};

GlobalMemoryStatus(&mst);

我本机是16G内存,用上面的那个函数会出问题,得到的数据溢出了,超过4G内存的需要用下面的函数来获取内存状态信息。

MEMORYSTATUSEX mst2 = {sizeof(mst2)};

GlobalMemoryStatusEx(&mst2);

大致可以获取的内容是CPU使用率,计算机内存大小,虚拟内存大小等相关信息。

14.3 确定地址空间的状态

Wi n d o w s提供了一个函数,可以用来查询地址空间中内存地址的某些信息(如大小,存储器类型和保护属性等)。实际上本章后面显示的V M M a p示例应用程序就使用这个函数来生成第1 3章所附的虚拟内存表交换信息。这个函数称为Vi r t u a l Q u e r y


Wi n d o w s还提供了另一个函数,它使一个进程能够查询另一个进程的内存信息:


    这两个函数基本相同,差别在于使用 Vi r t u a l Q u e r y E x时,可以传递你想要查询的地址空间信息的进程的句柄。调试程序和其他实用程序使用这个函数最多,几乎所有的应用程序都只需要调用Vi r t u a l Q u e r y函数。当调用Vi r t u a l Q u e r yE x)函数时,p v A d d r e s s参数必须包含你想要查询其信息的虚拟内存地址。 P m b i参数是你必须分配的M E M O RY _ B A S I C _ I N F O R M AT I O N结构的地址。该结构在Wi n N T. h文件中定义为下面的形式:


    最后一个参数是 d w L e n g t h,用于设定 M E M O RY _ B A S I C _ I N F O R M AT I O N结构的大小。Vi r t u a l Q u e r yE x)函数返回拷贝到缓存中的字节的数量。

    根据在p v A d d r e s s参数中传递的地址,Vi r t u a l Q u e r yE x)函数将关于共享相同状态、保护属性和类型的相邻页面的范围信息填入 M E M O RY _ B A S I C _ I N F O R M AT I O N结构中。表1 4 - 3描述了该结构的成员。


本章的剩余部分就是在说作者自己封装的一个函数VMQuery,可以更详细的获取内存信息。
    该结构的其他成员与内存管理毫无关系,为了完整起见,下面也对它们进行了介绍(见表1 4 - 2)。



原文地址:https://www.cnblogs.com/csnd/p/12062137.html