gpt4 book ai didi

windows - MEMORY_BASIC_INFORMATION 结构中的 BaseAddress 和 AllocationBase 有什么区别?

转载 作者:可可西里 更新时间:2023-11-01 13:01:05 27 4
gpt4 key购买 nike

在 MSDN 中我找到以下内容`

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

AllocationBase - 指向由 VirtualAlloc 函数分配的页面范围的基地址的指针。 BaseAddress成员指向的页面就包含在这个分配范围内。

但我不明白到底有什么区别。谁能告诉我区别? (不像在 MSDN 中那样 :) )

最佳答案

Windows 上的虚拟内存分配粒度为 64 KB,即 SYSTEM_INFO.dwAllocationGranularity 的值。但是虚拟内存页是4096字节,SYSTEM_INFO.dwPageSize的值。

当您使用 VirtualAlloc 分配虚拟内存时,您总是会得到一个 block ,其 BaseAddress 等于 AllocationBase。但是,如果您随后更改该 block 中一个或多个页面的页面保护,那么您可以观察到该 block 被分割为不同的 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() 调用如何要求将原始 block 分成 3 个具有不同 BaseAddress 但相同 AllocationBase 的区域。

关于windows - MEMORY_BASIC_INFORMATION 结构中的 BaseAddress 和 AllocationBase 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19465213/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com