【问题标题】:What is difference between BaseAddress and AllocationBase in MEMORY_BASIC_INFORMATION struct?MEMORY_BASIC_INFORMATION 结构中的 BaseAddress 和 AllocationBase 有什么区别?
【发布时间】:2013-10-28 05:09:54
【问题描述】:

在 MSDN 中我找到以下内容`

BaseAddress - 指向页面区域基地址的指针。

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

但我不明白真正的区别是什么。谁能告诉我区别? (不像 MSDN 中的 :))

【问题讨论】:

    标签: windows windows-7 process operating-system msdn


    【解决方案1】:

    Windows 上的虚拟内存分配的粒度为 64 KB,即 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, base = 00ED0000, size = 4096, protect = 4
    Alloc = 00ED0000, base = 00ED1000, size = 4096, protect = 1
    Alloc = 00ED0000, base = 00ED2000, size = 57344, protect = 4
    

    并注意 VirtualProtect() 调用如何要求将原始块拆分为 3 个具有不同 BaseAddress 但相同 AllocationBase 的区域。

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多