2013-10-19 10 views
7

एमएसडीएन में मुझे निम्नलिखितMEMORY_BASIC_INFORMATION संरचना में बेसएड्रेस और आवंटनबेस के बीच क्या अंतर है?

बेसएड्रेस - पृष्ठों के क्षेत्र के मूल पते पर एक सूचक।

आवंटनबेस - वर्चुअलअलोक फ़ंक्शन द्वारा आवंटित पृष्ठों की एक श्रृंखला के मूल पते पर एक सूचक। बेसएड्रेस सदस्य द्वारा इंगित पृष्ठ इस आवंटन सीमा के भीतर निहित है।

लेकिन मुझे समझ में नहीं आता कि वास्तव में क्या अंतर है। क्या कोई मुझे अंतर बता सकता है? (एमएसडीएन में पसंद नहीं है :))

उत्तर

14

विंडोज़ पर वर्चुअल मेमोरी आवंटन 64 किलोबाइट्स की ग्रैन्युलरिटी के साथ बनाया जाता है, SYSTEM_INFO.dwAllocationGranularity का मान। लेकिन वर्चुअल मेमोरी पेज 4096 बाइट्स हैं, SYSTEM_INFO.dwPageSize का मान।

जब आप वर्चुअलअलोक के साथ वर्चुअल मेमोरी आवंटित करते हैं, तो आपको हमेशा एक हिस्सा वापस मिल जाएगा जिसका बेस एड्रेस ऑलोकेशनबेस के बराबर है। लेकिन यदि आप इस खंड के भीतर एक या अधिक पृष्ठों के पेज संरक्षण को बदलते हैं तो आप इस खंड को एक अलग बेस एड्रेस के साथ विभाजित कर सकते हैं। बेस्ट एक नमूना कार्यक्रम के साथ दिखाया गया है, 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 क्षेत्रों में विभाजित किया जा करने के लिए विभिन्न बेस एड्रेस के साथ लेकिन एक ही आवंटनबेस।

संबंधित मुद्दे