在MSDN中,我发现以下`

BaseAddress – 指向页面区域的基址的指针.

AllocationBase – 指向VirtualAlloc函数分配的一系列页面的基址的指针. BaseAddress成员指向的页面包含在此分配范围内.

但我真的不明白有什么区别.谁能告诉我区别? (不像在MSDN :))

Windows上的虚拟内存分配的粒度为64千字节,即SYstem_INFO.dwAllocationGranularity的值.但虚拟内存页面为4096字节,SYstem_INFO.dwPageSize的值.

使用VirtualAlloc分配虚拟内存时,您将始终获得一个BaseAddress等于AllocationBase的块.但是,如果您随后更改了此块中一个或多个页面的页面保护,那么您可以观察到此块被细分为不同的BaseAddress.使用示例程序最佳显示,在MSVC上运行:

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <conio.h>

void showmem(void* mem) {
    MEMORY_BASIC_informatION info = {};
    VirtualQuery(mem,&info,sizeof info);
    printf("Alloc = %p,base = %p,size = %d,protect = %d\n",info.AllocationBase,info.BaseAddress,info.RegionSize,info.Protect);
}


int main() {
    BYTE* mem = (BYTE*)VirtualAlloc(0,65536,MEM_COMMIT,PAGE_READWRITE);
    printf("%s","Initial allocation:\n");
    showmem(mem);

    DWORD oldprotect;
    BOOL ok = VirtualProtect(mem + 4096,4096,PAGE_NOACCESS,&oldprotect);
    printf("%s","\nAfter protection changes:\n");
    showmem(mem);
    showmem(mem + 4096);
    showmem(mem + 4096 + 4096);

    _getch();
    return 0;
}

该程序的示例输出:

Initial allocation:
Alloc = 00ED0000,base = 00ED0000,size = 65536,protect = 4

After protection changes:
Alloc = 00ED0000,size = 4096,protect = 4
Alloc = 00ED0000,base = 00ED1000,protect = 1
Alloc = 00ED0000,base = 00ED2000,size = 57344,protect = 4

并注意VirtualProtect()调用如何要求原始块在具有不同BaseAddress但具有相同AllocationBase的3个区域中分割.

windows – MEMORY_BASIC_INFORMATION结构中的BaseAddress和AllocationBase有什么区别?的更多相关文章

  1. 使用iOS上的Memory Monitor,虚拟内存消耗与实际内存之间的差异

    有人说你不应该使用超过100MB.那是真正的记忆,还是虚拟记忆…或者可能是某种组合?我的实际内存一直在20到25MB之间,但崩溃时虚拟内存大约为190–205MB.这是一个截图:有人能够对此有所了解吗?

  2. windows – MEMORY_BASIC_INFORMATION结构中的BaseAddress和AllocationBase有什么区别?

    在MSDN中,我发现以下`BaseAddress–指向页面区域的基址的指针.AllocationBase–指向VirtualAlloc函数分配的一系列页面的基址的指针.BaseAddress成员指向的页面包含在此分配范围内.但我真的不明白有什么区别.谁能告诉我区别?

  3. 在ubuntu服务器系统安装永久性的虚拟内存

    虚拟内存,在本地装linux系统的时候,我们一般会提前划分出单独的swap分区。但是通常,云服务器在你重装系统的时候并没有给你分虚拟内存。而且云服务器的物理内存又死贵。没有虚拟内存可以说几乎不能活。我前几天就遇到了这个问题,下面是我通过命令安装虚拟内存的方法1.先看看系统中的虚拟内存情况用命令free查看系统内Swap分区大小。~$free-m上图,我的虚拟内存为1999M。如果没有安装虚拟内存,则显示的0。

  4. centos系统创建虚拟内存

    centos系统创建虚拟内存touchswapfileddif=/dev/zeroof=swapfilebs=1024kcount=2048mkswapswapfileswaponswapfileecho‘/data/swapfileswapswapdefault00’>>/etc/fstab

  5. centos 手动增加swap分区

    它类似于Windows中的虚拟内存。注意,OPENVZ架构的VPS是不支持手动添加交换分区的。但是重启系统后,swap分区又变成0了。删除swap交换文件1、先停止swap分区2、删除swap分区文件3、删除自动挂载配置命令

  6. 在CentOS 7 下安装redis详解

    当运行多个redis服务时,需要指定不同的pid文件和端口pidfile/var/run/redis.pid#Acceptconnectionsonthespecifiedport,defaultis6379.#Ifport0isspecifiedRediswillnotlistenonaTCPsocket.#端口没什么好说的port6379#Ifyouwantyoucanbindasingleinterface,ifthebindoptionisnot#specifiedalltheinterfaces

  7. 绘制进程的内存使用情况

    有没有人知道一个工具来可视地显示在Ubuntu上选定进程的内存使用情况?psaux将显示一个数字快照,但我真的很喜欢一条线,我可以看到改变,我敲了过程,希望看到意想不到的行为。有人有任何建议吗?我找不到任何真正的工具来做。但是我发现了一套简洁的小脚本集。使用这个小bash循环来进行日志记录:这将创建一个很好的内存使用的小日志文件,称为/tmp/mem.log。

  8. windows-server-2008 – Windows Server上的内存使用情况

    我们的服务器的可用内存总是很低.然而,顶级流程只占用我们服务器上应有的部分内容(10GB内存).我运行任务列表来获取所有进程的列表,并累计了他们使用的内存总量.总内存使用量为6GB,大约1GB内存“可用”.除非我遗漏了某些东西,否则意味着大约3GB的缺口(10GB总内存–使用6GB–1GB“可用”).我想知道会发生什么.每隔一段时间,“免费”内存就会下降到0,此时我们会遇到速度减慢.内存管理已经是

  9. windows-7 – 在Windows 7上减少虚拟内存页面文件大小

    我已将PC升级到16GBRAM,我注意到页面文件也是16GB.自从我决定使用SSD以来,硬盘空间有点受限,所以我想尝试一些16GB的回复.我已经阅读了很多文章,强烈反对完全禁用Paging文件,但我想知道是否可以将页面文件的大小减小到1GB的固定大小?这样做有什么害处吗?让我们假设我永远不会达到16GB的RAM限制.您需要了解Windows内存的工作原理.Myanswerhere为您提供该信息.如果您在Windows崩溃时不关心内存转储,可以将页面文件减少到正常工作集.

  10. windows – IIS工作进程的虚拟内存使用是否超出了专用内存限制?

    例如,如果我在“回收”设置中为应用程序池配置以下限制:虚拟内存:512Mb私有内存:128Mb–或IIS6用语中的“已用内存”这个过程是否可以使用90Mb的物理内存但是要求使用256Mb的虚拟内存,从而不会触发回收?因此,基于使用使用90MB物理和256MB虚拟的IIS工作进程配置的限制,不会触发应用程序池的回收.

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部