亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vmm.cpp

?? 小型的操作系統開發的原代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
//***********************************************************************/
//    Author                    : Garry
//    Original Date             : Aug,16 2005
//    Module Name               : VMM.CPP
//    Module Funciton           : 
//                                This module countains virtual memory manager's implementation
//                                code.
//    Last modified Author      :
//    Last modified Date        :
//    Last modified Content     :
//                                1.
//                                2.
//    Lines number              :
//***********************************************************************/

#ifndef __STDAFX_H__
#include "..\INCLUDE\StdAfx.h"
#endif

//
//This routine is used to debug the virtual memory manager.
//It prints out all virtual areas the current memory manager has.
//

VOID PrintVirtualArea(__VIRTUAL_MEMORY_MANAGER* lpMemMgr)
{
	BYTE                               strBuff[12];
	__VIRTUAL_AREA_DESCRIPTOR*         lpVad          = NULL;
	LPVOID                             lpAddr         = NULL;

	if(NULL == lpMemMgr)
		return;
	lpVad = lpMemMgr->lpListHdr;
	PrintLine("    Virtuam memory manager's reserved area :");
	while(lpVad)
	{
		PrintLine("---------------------");
		//PrintLine((LPSTR)&lpVad->strName[0]);
		lpAddr = lpVad->lpStartAddr;
		Hex2Str((DWORD)lpAddr,strBuff);
		PrintLine(strBuff);
		lpAddr = lpVad->lpEndAddr;
		Hex2Str((DWORD)lpAddr,strBuff);
		PrintLine(strBuff);
		lpVad = lpVad->lpNext;
	}
	PrintLine("    Finished to print out.");
}

//
//Declaration for member routines.
//

static LPVOID VirtualAlloc(__COMMON_OBJECT*,LPVOID,DWORD,DWORD,DWORD,UCHAR*,LPVOID);
static LPVOID GetPdAddress(__COMMON_OBJECT*);
static VOID   VirtualFree(__COMMON_OBJECT*,LPVOID);
static VOID InsertIntoList(__COMMON_OBJECT*,__VIRTUAL_AREA_DESCRIPTOR*);

//
//The implementation of VmmInitialize routine.
//

BOOL VmmInitialize(__COMMON_OBJECT* lpThis)
{
	__VIRTUAL_MEMORY_MANAGER*       lpManager      = NULL;
	__PAGE_INDEX_MANAGER*           lpPageIndexMgr = NULL;
	__VIRTUAL_AREA_DESCRIPTOR*      lpVad          = NULL;
	BOOL                            bResult        = FALSE;

	if(NULL == lpThis)    //Parameter check.
		return FALSE;

	lpManager = (__VIRTUAL_MEMORY_MANAGER*)lpThis;
	lpManager->VirtualAlloc     = VirtualAlloc;
	lpManager->VirtualFree      = VirtualFree;
	lpManager->GetPdAddress     = GetPdAddress;
	lpManager->dwVirtualAreaNum = 0L;

	//
	//The following code creates the page index manager object.
	//
	lpPageIndexMgr = (__PAGE_INDEX_MANAGER*)ObjectManager.CreateObject(&ObjectManager,
		NULL,
		OBJECT_TYPE_PAGE_INDEX_MANAGER);
	if(NULL == lpPageIndexMgr)    //Failed to create the page index manager object.
	{
		goto __TERMINAL;
	}

	if(!lpPageIndexMgr->Initialize((__COMMON_OBJECT*)lpPageIndexMgr))  //Can not initialize.
	{
		ObjectManager.DestroyObject(&ObjectManager,
			(__COMMON_OBJECT*)lpPageIndexMgr);
		lpPageIndexMgr = NULL;
		goto __TERMINAL;
	}
	lpManager->lpPageIndexMgr = lpPageIndexMgr;

	lpVad = (__VIRTUAL_AREA_DESCRIPTOR*)KMemAlloc(sizeof(__VIRTUAL_AREA_DESCRIPTOR),
		KMEM_SIZE_TYPE_ANY);
	if(NULL == lpVad)
		goto __TERMINAL;

#define SET(member,value) lpVad->member = value

	SET(lpManager,      lpManager);
	SET(lpStartAddr,    VIRTUAL_MEMORY_KERNEL_START);
	SET(lpEndAddr,      (LPVOID)VIRTUAL_MEMORY_KERNEL_END);
	SET(lpNext,         NULL);
	SET(dwAccessFlags,  VIRTUAL_AREA_ACCESS_RW);
	SET(dwAllocFlags,   VIRTUAL_AREA_ALLOCATE_COMMIT);
	SET(lpLeft,		    NULL);
	SET(lpRight,        NULL);
	SET(dwCacheFlags,   VIRTUAL_AREA_CACHE_NORMAL);

#undef SET

	__INIT_ATOMIC(lpVad->Reference);
	StrCpy((LPSTR)"System Kernel",(LPSTR)&lpVad->strName[0]);

	//
	//Insert the system kernel area into virtual memory manager's list.
	//
	InsertIntoList((__COMMON_OBJECT*)lpManager,lpVad);
	bResult = TRUE;    //Commit the whole transaction.

__TERMINAL:
	if(!bResult)
	{
		if(lpPageIndexMgr)
			ObjectManager.DestroyObject(&ObjectManager,
			(__COMMON_OBJECT*)lpPageIndexMgr);    //Destroy the page index manager object.
		if(lpVad)
			KMemFree((LPVOID)lpVad,KMEM_SIZE_TYPE_ANY,0L);  //Free memory.
		return FALSE;
	}
	return TRUE;
}

//
//The implementation of VmmUninitialize routine.
//

VOID VmmUninitialize(__COMMON_OBJECT* lpThis)
{
	__PAGE_INDEX_MANAGER*       lpPageIndexMgr  = NULL;
	__VIRTUAL_MEMORY_MANAGER*   lpManager       = NULL;
	__VIRTUAL_AREA_DESCRIPTOR*  lpVad           = NULL;

	if(NULL == lpThis)    //Parameter check.
		return;

	lpManager = (__VIRTUAL_MEMORY_MANAGER*)lpThis;
	//
	//Here,we should delete all the virtual areas belong to this virtual memory manager.
	//

	lpPageIndexMgr = lpManager->lpPageIndexMgr;
	if(lpPageIndexMgr)  //Destroy the page index manager object.
	{
		ObjectManager.DestroyObject(&ObjectManager,
			(__COMMON_OBJECT*)lpPageIndexMgr);
	}
	return;
}

//
//This macros is used to determin if a virtual address is within a virtual area.
//
#define WITHIN_VIRTUAL_AREA(lpAddr,lpVa) \
	(((DWORD)((lpVa)->lpStartAddr) <= (DWORD)lpAddr) && \
     ((DWORD)((lpVa)->lpEndAddr)   >= (DWORD)lpAddr))

//
//Check if a virtual memory address is between two virtual areas.
//
#define BETWEEN_VIRTUAL_AREA(lpAddr,lpVa1,lpVa2) \
	(((DWORD)((lpVa1)->lpEndAddr) < (DWORD)lpAddr) && \
	 ((DWORD)((lpVa2)->lpStartAddr) > (DWORD)lpAddr))

//
//Check if a virtual memory address is between two virtual addresses.
//
#define BETWEEN_VIRTUAL_ADDRESS(lpAddr,lpAddr1,lpAddr2) \
	(((DWORD)lpAddr1 <= (DWORD)lpAddr) && \
	 ((DWORD)lpAddr2 >  (DWORD)lpAddr))

//
//SearchVirtualArea_l is a helper routine,used to search a proper virtual area in the
//Virtual Memory Space,the "l" menas it searchs in the virtual area list.
//CAUTION: This routine is not safe,it's the caller's responsibility to guarantee the
//safety.
//
static LPVOID SearchVirtualArea_l(__COMMON_OBJECT* lpThis,LPVOID lpDesiredAddr,DWORD dwSize)
{
	__VIRTUAL_MEMORY_MANAGER*       lpMemMgr           = (__VIRTUAL_MEMORY_MANAGER*)lpThis;
	__VIRTUAL_AREA_DESCRIPTOR*      lpVad              = NULL;
	LPVOID                          lpStartAddr        = NULL;
	LPVOID                          lpEndAddr          = NULL;
	LPVOID                          lpDesiredEnd       = NULL;
	LPVOID                          lpPotentialStart   = NULL;
	LPVOID                          lpPotentialEnd     = NULL;
	BOOL                            bFind              = FALSE;

	if((NULL == lpThis) || (0 == dwSize)) //Invalidate parameters.
		return NULL;
	lpVad       = lpMemMgr->lpListHdr;
	if(NULL == lpVad)    //There is not any virtual area in the space.
		return lpDesiredAddr;    //Successfully.
	lpEndAddr       = lpVad->lpStartAddr;
	lpDesiredEnd    = (LPVOID)((DWORD)lpDesiredAddr + dwSize - 1);
	//lpPotentialEnd  = (LPVOID)((DWORD)lpPotentialStart + dwSize);
	while(lpVad)
	{
		if(BETWEEN_VIRTUAL_ADDRESS(lpDesiredAddr,lpStartAddr,lpEndAddr) && 
		   BETWEEN_VIRTUAL_ADDRESS(lpDesiredEnd,lpStartAddr,lpEndAddr))  //Find one.
		{
			return lpDesiredAddr;
		}
		if(!bFind)                      //To check if the gap can statisfy the required size,
			                            //that is,if the gap can be a potential virtual area.
		{
			lpPotentialStart = lpStartAddr;
			lpPotentialEnd   = (LPVOID)((DWORD)lpPotentialStart + dwSize - 1);
			if(BETWEEN_VIRTUAL_ADDRESS(lpPotentialEnd,lpStartAddr,lpEndAddr))
				                                                //Find a VA statisfy the
				                                                //original required size.
				bFind = TRUE;    //Set potential address to NULL.
		}
		lpStartAddr = (LPVOID)((DWORD)lpVad->lpEndAddr + 1);
		lpVad       = lpVad->lpNext;
		if(lpVad)
			lpEndAddr = lpVad->lpStartAddr;
		else
			lpEndAddr = (LPVOID)VIRTUAL_MEMORY_END;
	}
	if(BETWEEN_VIRTUAL_ADDRESS(lpDesiredAddr,lpStartAddr,lpEndAddr) &&
	   BETWEEN_VIRTUAL_ADDRESS(lpDesiredEnd,lpStartAddr,lpEndAddr))
	   return lpDesiredAddr;
	if(!bFind)    //Have not find a potential address,so try the last once.
	{
		lpPotentialStart = lpStartAddr;
		lpPotentialEnd   = (LPVOID)((DWORD)(lpPotentialStart) + dwSize - 1);
		if(BETWEEN_VIRTUAL_ADDRESS(lpPotentialEnd,lpStartAddr,lpEndAddr))  //Can statisfy.
			return lpPotentialStart;
		else
			return NULL;
	}
	else    //Have found a virtual area that statisfy the original request,though the start
		    //address not the original desired one.
	{
		return lpPotentialStart;
	}
	return NULL;
}

//
//SearchVirtualArea_t is a same routine as SearchVirtualArea_l,the difference is,this
//routine searchs in the AVL tree.
//
static LPVOID SearchVirtualArea_t(__COMMON_OBJECT* lpThis,LPVOID lpStartAddr,DWORD dwSize)
{
	return NULL;    //We will implement it in the future :-)
}

//
//InsertIntoList routine,this routine inserts a virtual area descriptor object into
//virtual area list.
//
static VOID InsertIntoList(__COMMON_OBJECT* lpThis,__VIRTUAL_AREA_DESCRIPTOR* lpVad)
{
	__VIRTUAL_MEMORY_MANAGER*       lpMemMgr         =	(__VIRTUAL_MEMORY_MANAGER*)lpThis;
	DWORD                           dwFlags          = 0L;
	__VIRTUAL_AREA_DESCRIPTOR*      lpFirst          =  NULL;
	__VIRTUAL_AREA_DESCRIPTOR*      lpSecond         =  NULL;

	if((NULL == lpThis) || (NULL == lpVad)) //Invalidate parameters.
		return;
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);
	lpFirst  = lpMemMgr->lpListHdr;
	if(NULL == lpFirst)    //There is not any element in the list.
	{
		lpMemMgr->lpListHdr        = lpVad;
		lpMemMgr->dwVirtualAreaNum ++;          //Increment the reference counter.
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return;
	}
	lpSecond = lpFirst;
	while(lpFirst)
	{
		if((DWORD)lpFirst->lpStartAddr > (DWORD)lpVad->lpStartAddr)    //Find the proper position.
			break;
		lpSecond = lpFirst;
		lpFirst  = lpFirst->lpNext;
	}
	if(lpSecond == lpFirst)  //Should be the first element in the list.
	{
		lpVad->lpNext       = lpMemMgr->lpListHdr;
		lpMemMgr->lpListHdr = lpVad;
		lpMemMgr->dwVirtualAreaNum ++;
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		return;
	}
	else    //Should not be the first element.
	{
		lpVad->lpNext    = lpSecond->lpNext;
		lpSecond->lpNext = lpVad;
	}
	lpMemMgr->dwVirtualAreaNum ++;    //Increment the virtual area's total number.
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
}

//
//InsertIntoTree routine,the same as above except that this routine is used to insert
//a virtual memory area into AVL tree.
//
static VOID InsertIntoTree(__COMMON_OBJECT* lpThis,__VIRTUAL_AREA_DESCRIPTOR* lpVad)
{
	return;  //We will implement this routine in the future. :-)
}

//
//A helper routine used to get a virtual area descriptor object by a virtual address.
//The label "l" means the search target is list.
//
static __VIRTUAL_AREA_DESCRIPTOR* GetVaByAddr_l(__COMMON_OBJECT* lpThis,LPVOID lpAddr)
{
	__VIRTUAL_MEMORY_MANAGER*     lpMemMgr = (__VIRTUAL_MEMORY_MANAGER*)lpThis;
	__VIRTUAL_AREA_DESCRIPTOR*    lpVad    = NULL;

	if((NULL == lpThis) || (NULL == lpAddr)) //Invalidate parameters.
		return NULL;
	lpVad = lpMemMgr->lpListHdr;
	while(lpVad)
	{
		if(WITHIN_VIRTUAL_AREA(lpAddr,lpVad))
			return lpVad;
		lpVad = lpVad->lpNext;
	}
	return lpVad;    //If can not search a proper VA,then NULL is returned.
}

//
//Get a virtual area descriptor object from AVL tree according to a virtual 
//memory address.
//
static __VIRTUAL_AREA_DESCRIPTOR* GetVaByAddr_t(__COMMON_OBJECT* lpThis,LPVOID lpAddr)
{
	return NULL;  //We will complete this routine in the future. :-)
}

//
//DoCommit routine.When VirtualAlloc is called with VIRTUAL_AREA_ALLOCATE_COMMIT,
//then is routine is called by VirtualAlloc.
//
static LPVOID DoCommit(__COMMON_OBJECT* lpThis,
					   LPVOID           lpDesiredAddr,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美年轻男男videosbes| 午夜久久久影院| 日本va欧美va瓶| 99r精品视频| 一区二区在线看| 欧美性一二三区| 日韩成人av影视| 精品日韩成人av| 成人午夜激情影院| 亚洲蜜臀av乱码久久精品 | 5月丁香婷婷综合| 日日摸夜夜添夜夜添国产精品| 91精品国产入口在线| 精品一区二区在线观看| 久久精品亚洲精品国产欧美 | 久久国内精品自在自线400部| 欧美va亚洲va| 97精品久久久午夜一区二区三区| 亚洲精品国产一区二区精华液 | 欧美日韩精品一区二区天天拍小说 | 麻豆国产91在线播放| 久久先锋资源网| 色一情一伦一子一伦一区| 日韩国产精品久久| 亚洲国产精品传媒在线观看| 欧美婷婷六月丁香综合色| 国产一区二区不卡| 一区二区三区四区不卡视频| 欧美成人a∨高清免费观看| 国产成人精品免费网站| 亚洲一区在线免费观看| 欧美精品一区二区三区蜜臀 | 国产综合色精品一区二区三区| 国产亚洲欧美日韩日本| 欧美日韩视频第一区| 国产91清纯白嫩初高中在线观看| 亚洲成a人片在线观看中文| 久久久久99精品国产片| 9191成人精品久久| 99久久综合色| 久久99精品久久久久婷婷| 亚洲综合丁香婷婷六月香| 国产无一区二区| 制服.丝袜.亚洲.另类.中文| 99在线精品一区二区三区| 激情五月激情综合网| 无吗不卡中文字幕| 日韩成人dvd| 亚洲激情在线激情| 日本一二三不卡| 久久影院午夜片一区| 欧美一级在线视频| 欧美性猛交一区二区三区精品| 成人免费毛片片v| 国内精品自线一区二区三区视频| 五月天丁香久久| 一区二区三区四区激情| 亚洲视频中文字幕| 久久久久国产一区二区三区四区| 67194成人在线观看| 欧美系列亚洲系列| 91在线小视频| 99精品桃花视频在线观看| 成人一级片网址| 国产一区二区三区四区在线观看| 日韩av二区在线播放| 婷婷中文字幕一区三区| 亚洲亚洲人成综合网络| 一区二区三区在线观看国产| 亚洲欧洲成人精品av97| 国产精品欧美一区喷水| 国产精品九色蝌蚪自拍| 国产精品素人视频| 欧美极品少妇xxxxⅹ高跟鞋| 久久―日本道色综合久久| 精品国产乱码久久久久久夜甘婷婷 | 日韩精品1区2区3区| 亚洲成a人v欧美综合天堂| 亚洲图片自拍偷拍| 日韩精品三区四区| 日韩福利视频导航| 免费观看一级欧美片| 久久精品av麻豆的观看方式| 精品亚洲aⅴ乱码一区二区三区| 久久精品国产免费| 国产一区二区三区免费在线观看| 激情五月播播久久久精品| 国产高清不卡二三区| 成人午夜碰碰视频| 一本大道久久a久久精品综合| 在线亚洲一区二区| 欧美日韩免费一区二区三区 | 精品视频一区二区三区免费| 欧美日韩精品电影| 精品理论电影在线| 欧美国产日韩精品免费观看| 亚洲免费看黄网站| 午夜精品成人在线视频| 韩国欧美国产1区| 成人高清免费在线播放| 欧美在线你懂得| 欧美一区二区三区男人的天堂| 欧美mv日韩mv国产| 中文字幕一区二区三区蜜月| 亚洲激情成人在线| 久久精品99国产精品| 成人av网在线| 欧美日韩国产一二三| 精品国免费一区二区三区| 国产欧美精品日韩区二区麻豆天美| 亚洲毛片av在线| 久久不见久久见免费视频1| 成人avav影音| 国产日韩欧美不卡| 亚洲动漫第一页| 国产乱码精品一区二区三区五月婷 | 亚洲天堂网中文字| 日本欧美大码aⅴ在线播放| 国产精品资源在线看| 99久久综合国产精品| 欧美理论片在线| 国产精品美女久久久久久久久久久 | 欧美极品美女视频| 亚洲成人午夜影院| 国产99久久久国产精品免费看| 一本一道综合狠狠老| 精品日韩在线观看| 亚洲午夜在线电影| 国产sm精品调教视频网站| 欧美三级电影一区| 亚洲国产精品传媒在线观看| 青青草原综合久久大伊人精品| 99精品视频在线观看免费| 欧美成人伊人久久综合网| 夜夜揉揉日日人人青青一国产精品| 国产一区二区三区免费播放| 欧美性感一类影片在线播放| 久久久综合精品| 免费成人在线观看视频| 欧美在线观看禁18| 国产精品久久网站| 久久99精品久久只有精品| 欧美区一区二区三区| 一区二区视频在线| 成人免费视频caoporn| 26uuu色噜噜精品一区二区| 青娱乐精品在线视频| 91福利在线播放| 日韩一区日韩二区| av男人天堂一区| 国产日韩欧美亚洲| 国产精品一区三区| 欧美精品一区在线观看| 久久av中文字幕片| 欧美成人精品1314www| 日本美女一区二区三区| 欧美日韩国产综合一区二区| 亚洲激情综合网| 色猫猫国产区一区二在线视频| 中文久久乱码一区二区| 国产91综合网| 久久久精品影视| 国产成人精品综合在线观看| ww亚洲ww在线观看国产| 国内久久精品视频| 久久精品免视看| 国产98色在线|日韩| 国产精品午夜久久| 97国产一区二区| 国产精品美女一区二区三区| 成人97人人超碰人人99| 国产精品理伦片| 色综合久久综合网97色综合| 亚洲欧美一区二区久久| 91蜜桃免费观看视频| 亚洲精选免费视频| 在线观看成人小视频| 天天综合网天天综合色| 日韩一级视频免费观看在线| 色国产综合视频| 亚洲综合免费观看高清完整版 | 国产精品日韩成人| eeuss鲁片一区二区三区| 亚洲日本va午夜在线影院| 91美女视频网站| 午夜视频一区二区三区| 日韩欧美精品三级| 国产精品中文字幕一区二区三区| 久久久99久久| bt欧美亚洲午夜电影天堂| 亚洲黄色免费电影| 日韩亚洲欧美中文三级| 国产99久久久国产精品| 成人欧美一区二区三区白人| 欧美在线小视频| 久久国产精品99久久人人澡| 日本一区二区不卡视频| 94-欧美-setu| 青娱乐精品在线视频| 中文字幕高清不卡|