¼ÆËã»ú²Ù×÷ϵͳʵÑéÖ¸µ¼Êé ÁªÏµ¿Í·þ

·¢²¼Ê±¼ä : ÐÇÆÚÎå ÎÄÕ¼ÆËã»ú²Ù×÷ϵͳʵÑéÖ¸µ¼Êé¸üÐÂÍê±Ï¿ªÊ¼ÔĶÁ8f9190d380eb6294dd886c81

¡¶²Ù×÷ϵͳ¹ÜÀí¡·ÊµÑéÖ¸µ¼Êé

return(0) ; }

static DWORD WINAPI DecThreadProc(LPVOID lpParam) {

// ½«²ÎÊý½âÊÍΪ ?this? Ö¸Õë CCountUpDown* pThis =

reinterpret_cast (lpParam) ; // µ÷ÓöÔÏóµÄ¼õÉÙ·½·¨²¢·µ»ØÒ»¸öÖµ pThis -> DOCount(-1) ; return(0) ; }

protected:

HANDLE m_hThreadInc; HANDLE m_hThreadDec;

HANDLE m_hMutexValue; int m_nValue; int m_nAccess ;

} ;

void main() {

CCountUpDown ud(50) ; ud.WaitForCompletion() ; }

²½Öè8£ºµ¥»÷¡°Build¡±²Ëµ¥Öеġ°Compile 4-2.cpp¡±ÃüÁ²¢µ¥»÷¡°ÊÇ¡±°´Å¥È·ÈÏ¡£ÏµÍ³¶Ô4-2.cpp½øÐбàÒë¡£

²½Öè9£º±àÒëÍê³Éºó£¬µ¥»÷¡°Build¡±²Ëµ¥Öеġ°Build 4-2.exe¡±ÃüÁ½¨Á¢4-2.exe¿ÉÖ´ÐÐÎļþ¡£

²Ù×÷ÄÜ·ñÕý³£½øÐУ¿Èç¹û²»ÐУ¬Ôò¿ÉÄܵÄÔ­ÒòÊÇʲô£¿

____________________________________________________________________ ________________________________________________________________________ ²½Öè10£ºÔÚ¹¤¾ßÀ¸µ¥»÷¡°Execute Program¡±°´Å¥£¬Ö´ÐÐ4-2.exe³ÌÐò¡£

·ÖÎö³ÌÐò4-2µÄÔËÐнá¹û£¬¿ÉÒÔ¿´µ½Ïß³Ì (¼ÓºÍ¼õÏß³Ì) µÄ½»ÌæÖ´ÐÐ (ÒòΪSleep() APIÔÊÐíWindowsÇл»Ïß³Ì) ¡£ÔÚÿ´ÎÔËÐÐÖ®ºó£¬ÊýÖµÓ¦¸Ã·µ»Ø³õʼֵ (0) £¬ÒòΪÔÚÿ´ÎÔËÐÐÖ®ºóдÈëÏß³ÌÔڵȴý¶ÓÁÐÖбä³É×îºóÒ»¸ö£¬Äں˱£Ö¤ËüÔÚÆäËûÏ̹߳¤×÷ʱ²»»áÔÙÔËÐС£

1) ÇëÃèÊöÔËÐнá¹û (Èç¹ûÔËÐв»³É¹¦£¬Ôò¿ÉÄܵÄÔ­ÒòÊÇʲô£¿) £º

____________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________

2) ¸ù¾ÝÔËÐÐÊä³ö½á¹û£¬¶ÔÕÕ·ÖÎö4-2³ÌÐò£¬¿ÉÒÔ¿´³ö³ÌÐòÔËÐеÄÁ÷³ÌÂð£¿Çë¼òµ¥ÃèÊö£º ____________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________

30

¡¶²Ù×÷ϵͳ¹ÜÀí¡·ÊµÑéÖ¸µ¼Êé

ʵÑéÈý ´æ´¢¹ÜÀí

[1]Windows 2000ÄÚ´æ½á¹¹

±³¾°ÖªÊ¶

Windows 2000ÊÇ32λµÄ²Ù×÷ϵͳ£¬Ëüʹ¼ÆËã»úCPU¿ÉÒÔÓÃ32λµØÖ·¶Ô32λÄÚ´æ¿é½øÐвÙ×÷¡£ÄÚ´æÖеÄÿһ¸ö×Ö½Ú¶¼¿ÉÒÔÓÃÒ»¸ö32λµÄÖ¸ÕëÀ´Ñ°Ö·¡£ÕâÑù£¬×î´óµÄ´æ´¢¿Õ¼ä¾ÍÊÇ232×Ö½Ú»ò4000Õ××Ö½Ú (4GB) ¡£ÕâÑù£¬ÔÚWindowsÏÂÔËÐеÄÿһ¸öÓ¦ÓóÌÐò¶¼ÈÏΪÄܶÀÕ¼¿ÉÄܵÄ4GB´óСµÄ¿Õ¼ä

¶øÁíÒ»·½Ã棬ʵ¼ÊÉÏûÓм¸Ì¨»úÆ÷µÄRAMÄÜ´ïµ½4GB£¬¸ü²»±Ø˵ÈÃÿ¸ö½ø³Ì¶¼¶ÀÏí4GBÄÚ´æÁË¡£WindowsÔÚÄ»ºó½«ÐéÄâÄÚ´æ (virtual memory£¬VM) µØÖ·Ó³Éäµ½Á˸÷½ø³ÌµÄÎïÀíÄÚ´æµØÖ·ÉÏ¡£¶øËùνÎïÀíÄÚ´æÊÇÖ¸¼ÆËã»úµÄRAMºÍÓÉWindows·ÖÅäµ½Óû§Çý¶¯Æ÷¸ùĿ¼ÉϵĻ»Ò³Îļþ¡£ÎïÀíÄÚ´æÍêÈ«ÓÉϵͳ¹ÜÀí¡£ ʵÑéÄ¿µÄ

1£© ͨ¹ýʵÑéÁ˽âwindows2000ÄÚ´æµÄʹÓã¬Ñ§Ï°ÈçºÎÔÚÓ¦ÓóÌÐòÖйÜÀíÄÚ´æ¡¢Ìå»á

WindowsÓ¦ÓóÌÐòÄÚ´æµÄ¼òµ¥ÐÔºÍ×ÔÎÒ·À»¤ÄÜÁ¦¡£

2£© Á˽âwindows2000µÄÄÚ´æ½á¹¹ºÍÐéÄâÄÚ´æµÄ¹ÜÀí£¬½ø¶øÁ˽â½ø³Ì¶ÑºÍwindowsΪʹ

ÓÃÄÚ´æ¶øÌṩµÄһЩÀ©Õ¹¹¦ÄÜ¡£ ¹¤¾ß/×¼±¸¹¤×÷

ÄúÐèÒª×öÒÔÏÂ×¼±¸£º

һ̨ÔËÐÐWindows 2000 Professional²Ù×÷ϵͳµÄ¼ÆËã»ú ¼ÆËã»úÖÐÐè°²×°Visual C++ 6.0רҵ°æ»òÆóÒµ°æ ʵÑéÄÚÈÝÓë²½Öè

WindowsÌṩÁËÒ»¸öAPI¼´GetSystemInfo() £¬ÒÔ±ãÓû§Äܼì²éϵͳÖÐÐéÄâÄÚ´æµÄһЩÌØÐÔ¡£³ÌÐò5-1ÏÔʾÁËÈçºÎµ÷Óøú¯ÊýÒÔ¼°ÏÔʾϵͳÖе±Ç°ÄÚ´æµÄ²ÎÊý¡£

²½Öè1£ºµÇ¼½øÈëWindows 2000 Professional¡£

²½Öè2£ºÔÚ¡°¿ªÊ¼¡±²Ëµ¥Öе¥»÷¡°³ÌÐò¡±-¡°Microsoft Visual Studio 6.0¡±¨C¡°Microsoft Visual C++ 6.0¡±ÃüÁ½øÈëVisual C++´°¿Ú¡£

²½Öè3£ºÔÚ¹¤¾ßÀ¸µ¥»÷¡°´ò¿ª¡±°´Å¥£¬ÔÚ¡°´ò¿ª¡±¶Ô»°¿òÖÐÕÒµ½²¢´ò¿ªÊµÑéÔ´³ÌÐò5-1.cpp¡£ ³ÌÐò5-1£º»ñÈ¡ÓйØϵͳµÄÄÚ´æÉèÖõÄÐÅÏ¢ // ¹¤³Ìvmeminfo #include #include #include #include

#pragma comment(lib, \

void main() {

// Ê×ÏÈ£¬ÈÃÎÒÃÇ»ñµÃϵͳÐÅÏ¢ SYSTEM_INFO si;

:: ZeroMemory(&si, sizeof(si) ) ; :: GetSystemInfo(&si) ;

31

¡¶²Ù×÷ϵͳ¹ÜÀí¡·ÊµÑéÖ¸µ¼Êé

// ʹÓÃÍâ¿Ç¸¨Öú³ÌÐò¶ÔһЩ³ß´ç½øÐиñʽ»¯ TCHAR szPageSize[MAX_PATH];

::StrFormatByteSize(si.dwPageSize, szPageSize, MAX_PATH) ;

DWORD dwMemSize = (DWORD)si.lpMaximumApplicationAddress - (DWORD) si.lpMinimumApplicationAddress; TCHAR szMemSize [MAX_PATH] ;

:: StrFormatByteSize(dwMemSize, szMemSize, MAX_PATH) ;

// ½«ÄÚ´æÐÅÏ¢ÏÔʾ³öÀ´

std :: cout << \

std :: cout.fill ('0') ;

std :: cout << \ << std :: hex << std :: setw(8)

<< (DWORD) si.lpMinimumApplicationAddress << std :: endl;

std :: cout << \ << std :: hex << std :: setw(8)

<< (DWORD) si.lpMaximumApplicationAddress << std :: endl;

std :: cout << \ << szMemSize << std :: endl ; }

²½Öè4£ºµ¥»÷¡°Build¡±²Ëµ¥Öеġ°Compile 5-1.cpp¡±ÃüÁ²¢µ¥»÷¡°ÊÇ¡±°´Å¥È·ÈÏ¡£ÏµÍ³¶Ô4-1.cpp½øÐбàÒë¡£

²½Öè5£º±àÒëÍê³Éºó£¬µ¥»÷¡°Build¡±²Ëµ¥Öеġ°Build 5-1.exe¡±ÃüÁ½¨Á¢5-1.exe¿ÉÖ´ÐÐÎļþ¡£

²Ù×÷ÄÜ·ñÕý³£½øÐУ¿Èç¹û²»ÐУ¬Ôò¿ÉÄܵÄÔ­ÒòÊÇʲô£¿

____________________________________________________________________ ________________________________________________________________________ ²½Öè6£ºÔÚ¹¤¾ßÀ¸µ¥»÷¡°Execute Program¡± (Ö´ÐгÌÐò) °´Å¥£¬Ö´ÐÐ5-1.exe³ÌÐò¡£ ÔËÐнá¹û (·ÖÐÐÊéд¡£Èç¹ûÔËÐв»³É¹¦£¬Ôò¿ÉÄܵÄÔ­ÒòÊÇʲô£¿) £º

1) ÐéÄâÄÚ´æÿҳÈÝÁ¿Îª£º 2) ×îСӦÓõØÖ·£º 3) ×î´óÓ¦ÓõØַΪ£º 4) µ±Ç°¿É¹©Ó¦ÓóÌÐòʹÓõÄÄÚ´æ¿Õ¼äΪ£º 5) µ±Ç°¼ÆËã»úµÄʵ¼ÊÄÚ´æ´óСΪ£º ÔĶÁºÍ·ÖÎö³ÌÐò5-1£¬Çë»Ø´ðÎÊÌ⣺

1) ÀíÂÛÉÏÿ¸öwindowsÓ¦ÓóÌÐò¿ÉÒÔ¶ÀÕ¼µÄ×î´ó´æ´¢¿Õ¼äÊÇ£º________

2) ÔÚ³ÌÐò5-1ÖУ¬ÓÃÓÚ¼ìË÷ϵͳÖÐÐéÄâÄÚ´æÌØÐÔµÄAPIº¯ÊýÊÇ£º

Ìáʾ£º¿É¹©Ó¦ÓóÌÐòʹÓõÄÄÚ´æ¿Õ¼äʵ¼ÊÉÏÒѾ­¼õÈ¥ÁË¿ªÍ·Óë½áβÁ½¸ö64KBµÄ±£»¤Çø¡£ÐéÄâÄÚ´æ¿Õ¼äÖеÄ64KB±£»¤ÇøÊÇ·ÀÖ¹±à³Ì´íÎóµÄÒ»ÖÖWindows·½Ê½¡£ÈκζÔÄÚ´æÖÐÕâÒ»ÇøÓòµÄ·ÃÎÊ (¶Á¡¢Ð´¡¢Ö´ÐÐ) ¶¼½«Òý·¢Ò»¸ö´íÎóÏݾ®£¬´Ó¶øµ¼Ö´íÎó²¢ÖÕÖ¹³ÌÐòµÄÖ´ÐС£Ò²¾ÍÊÇ˵£¬¼ÙÈçÓû§ÓÐÒ»¸öNULLÖ¸Õë (µØַΪ0) £¬µ«ÈÔÊÔͼÔÚ´Ë֮ǰºÜ½üµÄµØÖ·´¦Ê¹ÓÃÁíÒ»¸öÖ¸Õ룬Õ⽫ÒòΪÊÔͼ´Ó¸üµÍµÄ±£ÁôÇøÓò¶ÁдÊý¾Ý£¬´Ó¶ø²úÉúÒâÍâ´íÎó²¢ÖÕÖ¹³ÌÐòµÄÖ´ÐС£

[2]Windows 2000ÐéÄâÄÚ´æ

32

¡¶²Ù×÷ϵͳ¹ÜÀí¡·ÊµÑéÖ¸µ¼Êé

±³¾°ÖªÊ¶

ÔÚWindows 2000»·¾³Ï£¬4GBµÄÐéÄâµØÖ·¿Õ¼ä±»»®·Ö³ÉÁ½¸ö²¿·Ö£ºµÍ¶Ë2GBÌṩ¸ø½ø³ÌʹÓ㬸߶Ë2GBÌṩ¸øϵͳʹÓá£ÕâÒâζ×ÅÓû§µÄÓ¦ÓóÌÐò´úÂ룬°üÀ¨DLLÒÔ¼°½ø³ÌʹÓõĸ÷ÖÖÊý¾ÝµÈ£¬¶¼×°ÔÚÓû§½ø³ÌµØÖ·¿Õ¼äÄÚ (µÍ¶Ë2GB) ¡£Óû§¹ý³ÌµÄÐéÄâµØÖ·¿Õ¼äÒ²±»·Ö³ÉÈý²¿·Ö£º

1£©ÐéÄâÄÚ´æµÄÒѵ÷ÅäÇø (committed) £º¾ßÓб¸ÓõÄÎïÀíÄڴ棬¸ù¾Ý¸ÃÇøÓòÉ趨µÄ·ÃÎÊȨÏÞ£¬Óû§¿ÉÒÔ½øÐÐд¡¢¶Á»òÔÚÆäÖÐÖ´ÐгÌÐòµÈ²Ù×÷¡£

2£©ÐéÄâÄÚ´æµÄ±£ÁôÇø (reserved) £ºÃ»Óб¸ÓõÄÎïÀíÄڴ棬µ«ÓÐÒ»¶¨µÄ·ÃÎÊȨÏÞ¡£ 3£©ÐéÄâÄÚ´æµÄ×ÔÓÉÇø (free) £º²»ÏÞ¶¨ÆäÓÃ;£¬ÓÐÏàÓ¦µÄPAGE_NOACCESSȨÏÞ¡£ ÓëÐéÄâÄÚ´æÇøÏà¹ØµÄ·ÃÎÊȨÏÞ¸æ֪ϵͳ½ø³Ì¿ÉÔÚÄÚ´æÖнøÐкÎÖÖÀàÐ͵IJÙ×÷¡£ÀýÈ磬Óû§²»ÄÜÔÚÖ»ÓÐPAGE_READONLYȨÏÞµÄÇøÓòÉϽøÐÐд²Ù×÷»òÖ´ÐгÌÐò£»Ò²²»ÄÜÔÚÖ»ÓÐPAGE_EXECUTEȨÏÞµÄÇøÓòÀï½øÐжÁ¡¢Ð´²Ù×÷¡£¶ø¾ßÓÐPAGE_ NOACCESSȨÏÞµÄÌØÊâÇøÓò£¬ÔòÒâζ×Ų»ÔÊÐí½ø³Ì¶ÔÆäµØÖ·½øÐÐÈκβÙ×÷¡£

ÔÚ½ø³Ì×°Èë֮ǰ£¬Õû¸öÐéÄâÄÚ´æµÄµØÖ·¿Õ¼ä¶¼±»ÉèÖÃΪֻÓÐPAGE_NOACCESSȨÏÞµÄ×ÔÓÉÇøÓò¡£µ±ÏµÍ³×°Èë½ø³Ì´úÂëºÍÊý¾Ýºó£¬²Å½«ÄÚ´æµØÖ·µÄ¿Õ¼ä±ê¼ÇΪÒѵ÷ÅäÇø»ò±£ÁôÇø£¬²¢½«ÖîÈçEXECUTE¡¢READWRITEºÍREADONLYµÄȨÏÞÓëÕâЩÇøÓòÏà¹ØÁª¡£

Èç±í3-2Ëùʾ£¬¸ø³öÁËMEMORY_BASIC_INFORMAITONµÄ½á¹¹£¬´ËÊý¾ÝÃèÊöÁ˽ø³ÌÐéÄâÄÚ´æ¿Õ¼äÖеÄÒ»×éÐéÄâÄÚ´æÒ³ÃæµÄµ±Ç°×´Ì¬£¬ÆÚÖÐStateÏî±íÃ÷ÕâЩÇøÓòÊÇ·ñΪ×ÔÓÉÇø¡¢Òѵ÷ÅäÇø»ò±£ÁôÇø£»ProtectÏîÔò°üº¬ÁËwindowsϵͳΪÕâЩÇøÓòÌí¼ÓÁ˺ÎÖÖ·ÃÎʱ£»¤£»typeÏîÔò±íÃ÷ÕâЩÇøÓòÊÇ¿ÎÖ´ÐÐͼÏñ¡¢ÄÚ´æÓ³ÉäÎļþ»¹ÊǼòµ¥µÄ˽ÓÐÄÚ´æ¡£VirsualQueryEX() APIÄÜÈÃÓû§ÔÚÖ¸¶¨µÄ½ø³ÌÖУ¬¶ÔÐéÄâÄÚ´æµØÖ·µÄ´óСºÍÊôÐÔ½øÐмì²â¡£

Windows»¹ÌṩÁËÒ»ÕûÌ×ÄÜʹÓû§¾«È·¿ØÖÆÓ¦ÓóÌÐòµÄÐéÄâµØÖ·¿Õ¼äµÄÐéÄâÄÚ´æAPI¡£Ò»Ð©ÓÃÓÚÐéÄâÄÚ´æ²Ù×÷¼°¼ì²âµÄAPIÈç±í3-2Ëùʾ¡£

±í3-1 MEMORY_BASIC_INFORMAITON½á¹¹µÄ³ÉÔ± ³ÉÔ±Ãû³Æ PVOID BaseAddress PVOID AllocationBase ÐéÄâÄÚ´æÇøÓò¿ªÊ¼´¦µÄÖ¸Õë Èç¹ûÕâ¸öÌض¨µÄÇøÓòΪ×Ó·ÖÅäÇøµÄ»°£¬ÔòΪÐéÄâÄÚ´æÍâÃæÇøÓòµÄÖ¸Õ룻·ñÔò´ËÖµÓëBaseAddressÏàͬ ÐéÄâÄÚ´æ×î³õ·ÖÅäÇøÓòµÄ±£»¤ÊôÐÔ¡£Æä¿ÉÄÜÖµ°üÀ¨£º DWORD AllocationProtect PAGE_NOACCESS,PAGE_READONLY,PAGE_READWRITEPAGE_EXECUTE_READ DWORD RegionSize DWORD State DWORD Protect DWORD Type ÐéÄâÄÚ´æÇøÓòµÄ×Ö½ÚÊý ÇøÓòµÄµ±Ç°·ÖÅä״̬¡£Æä¿ÉÄÜֵΪMEM_COMMIT,MEM_PREEºÍMEM_RESERVE ÐéÄâÄڴ浱ǰµÄ±£»¤ÊôÐÔ¡£¿ÉÄÜÖµÓëAllocationProtect³ÉÔ±µÄÏàͬ ÐéÄâÄÚ´æÇøÓòÖгöÏÖµÄÒ³ÃæÀàÐÍ¡£¿ÉÄÜֵΪMEM_IMAGE,MEM_MAPPEDºÍMEM_PRIVATE ±í3-2 ÐéÄâÄÚ´æµÄAPI APIÃû³Æ VisualQueryEX() VisualAlloc() VirsualFree() VirsualProtect() VirsualLock() ÃèÊö ͨ¹ýÌî³äMEMORY_BASIC_INFORMATION½á¹¹¼ì²â½ø³ÌÄÚÐéÄâÄÚ´æµÄÇøÓò ±£Áô»òµ÷Åä½ø³ÌµÄ²¿·ÖÐéÄâÄڴ棬ÉèÖ÷ÖÅäºÍ±£»¤±êÖ¾ ÊÍ·Å»òÊÕ»ØÓ¦ÓóÌÐòʹÓõIJ¿·ÖÐéÄâµØÖ· ¸Ä±äÐéÄâÄÚ´æÇøÓò±£»¤¹æ·¶ ·Àֹϵͳ½«ÐéÄâÄÚ´æÇøÓòͨ¹ýϵͳ½»»»µ½Ò³ÃæÎļþÖÐ 33

ºÍÄ¿µÄ