xp下用户程序空间分配(7):Heap

我们都知道在程序里可以使用malloc在堆上分配内存,显然windows应该为这个Heap分配一块空间的 ,我们在主程序里用malloc分配一小块内存,看看指针指向哪里:

char* p = (char*)malloc (10);

得到一个指针:0x00b267b0

在内存块里面找,很容易就发现了目标:

从这里可以发现malloc采用的算法并不会在一开始就分配一块很大的内存,如果我们接着用:

p = (char*)malloc(0x10000);

分配一块64K的内存,这时可以发现又多了一块内存:

而这块内存在第一次分配时是空闲的。

由此可以猜测,malloc可以分配得到的最大内存块应该取 决于最大的空闲块。写段代码测试一下:

void block_test()
{
     SYSTEM_INFO info;
     MEMORY_BASIC_INFORMATION mi;
     HANDLE hProcess;
     DWORD dwAddr;
     MEMORY_BASIC_INFORMATION miBlock[1000];
     int nCount = 0, nMaxSize = 0;
     char* p = NULL;
     hProcess = GetCurrentProcess();
     GetSystemInfo(&info);
     dwAddr = (DWORD)info.lpMinimumApplicationAddress;
     do
     {
         VirtualQueryEx(hProcess, (LPCVOID)dwAddr, &mi, sizeof(mi));
         memcpy(&miBlock[nCount++], &mi, sizeof(mi));
         dwAddr += mi.RegionSize;
         if((mi.State & MEM_FREE) && mi.RegionSize > nMaxSize)
              nMaxSize = mi.RegionSize;
     } while(dwAddr < (DWORD)info.lpMaximumApplicationAddress);

     p = malloc(nMaxSize);
………..

}

时间: 2024-10-22 12:33:47

xp下用户程序空间分配(7):Heap的相关文章

xp下用户程序空间分配(2):栈

每个线程都有自己的栈空间,这个空间大小是在CreateThread时指定的,而主线程的栈则是由xp在创 建进程时指定的,在vs2008下设置一个断点,中断程序的执行,可以看到主线程ESP的值为0x00124914, 这个指针落在下面这个区域: 这块空间的上限是0x0013 0000,这个值与我们读出来的NT_TIB结构体里面的StackBase的值是一致的 ,也就是说主线程的栈空间从0x0013 0000开始往下增长.但是在NT_TIB里面的StackLimit值却只有 0x00000 a000

xp下用户程序空间分配(9):还剩下什么?

在去除前面的部分后,看看内存里还剩下什么: 基址 分配基址 分配保护 大小 状态 保护 类型 00010000 00010000 00000004 PAGE_READWRITE 00002000 00001000 MEM_COMMIT 00000004 PAGE_READWRITE 00020000 MEM_PRIVATE 7ffdd000 7ffdd000 00000004 PAGE_READWRITE 00001000 00001000 MEM_COMMIT 00000004 PAGE_RE

xp下用户程序空间分配(1):大致框架

<windows核心编程>告诉我们,对于每个应用程序的4G虚拟空间可以分为4个大块: 0x0000 0000 ~ 0x0000 ffff:空指针赋值分区 0x0001 0000 ~ 0x7ffe ffff:用户模式分区 0x7fff 0000 ~ 0x7fff ffff:64K禁入分区 0x8000 0000 ~ 0xffff ffff:内核模式分区 但是再要具体点就需要自己研究了. 咱就来看看一个应用程序是怎么使用这4G的空间的 .先写段代码查询一下这4G空间中内存块的大致分类: SYSTE

xp下用户程序空间分配(8):MEM_MAPPED

在去除前面的那些东西之后,我们的内存块里面还有一堆MEM_MAPPED的内容,就像这样的块: MSDN里面这样解释MEM_MAPPED这种类型: Indicates that the memory pages within the region are mapped into the view of a section. 很自然地我们想用GetMappedFileName来看看映射到这些 内存区域的文件名,于是发现了下面几个块的确是做了文件映射: 那么其它东西是哪里来的? 使用GetLastEr

xp下用户程序空间分配(6):加载用户DLL

在本项目里使用了自行编译的一个DLL-cywin.dll,这个DLL占用的内存块出奇的多: 同样把文件里的内容dump出来进行比较.

xp下用户程序空间分配(5):加载系统DLL

ntdll.dll是加载的第一个系统DLL,它的模块信息: 名称 基址 大小 入口点 E:\WINDOWS\system32\ntdll.dll 7c920000 00093000 7c932c28 对应的内存块: 和exe略微有所区别,还是用dumpbin把它的文件内容导出来进行比较. 1.1 文件头 DLL和EXE文 件一样都是PE格式,因此它们的文件头的结构是一样的,看看从ntdll.dll中dump出来的信息: 14C machine (x86) 4 number of sections

xp下用户程序空间分配(4):加载主程序

这个是主程序,它的模块信息: 名称 基址 大小 入口点 f:\embed\etools\Debug\bin\bash.exe 00400000 0006f000 0045bb30 对应的内存块: 这些块的类型都是MEM_IMAGE,且分配时的保护标志都是PAGE_EXECUTE_WRITECOPY,MSDN这样解释这 个标志位: Enables execute, read, and write access to the committed region of image file code p

xp下用户程序空间分配(3):加载文件

一个程序要想执行,总是要加载到内存里面的,为此我们使用下面的代码查询所有模块的信息,再找 到它们在内存里面的对应位置: HANDLE hProcess; HMODULE hModule[0x70]; TCHAR strFileName [MAX_PATH]; DWORD cbNeeded; MODULEINFO modinfo; hProcess = GetCurrentProcess(); if(EnumProcessModules(hProcess, hModule, sizeof(HMOD

Win XP下全新安装Apache2,PHP5,MYSQL5

apache|mysql|php5 看PHP,MYSQL,都出了新版本,想尝尝鲜,就试着安装了一下,然后把安装过程记了下来,希望能对学习PHP的新手有些帮助,斑竹可以考虑精一下了 Windows XP下全新安装Apache2,PHP5,MYSQL5,Zend的简单过程 一.下载地址: Apache2.0.50 :http://httpd.apache.org/download.cgi PHP5.0.2 :http://cn2.php.net/get/php-5.0.2-Win32.zip/fro