亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
精品日韩一区二区三区| 中文字幕人成不卡一区| 欧美激情综合网| 亚洲国产美女搞黄色| 国产成人精品免费一区二区| 欧美日韩在线播放| 亚洲欧洲韩国日本视频| 狠狠色伊人亚洲综合成人| 欧美日韩亚洲综合一区二区三区| 国产精品美女久久久久av爽李琼| 麻豆久久一区二区| 在线观看三级视频欧美| 中文字幕一区二区三区蜜月| 韩国精品一区二区| 欧美一区二区三区性视频| 亚洲一区免费观看| 91成人看片片| 亚洲三级在线免费观看| 国产suv精品一区二区6| 久久久亚洲高清| 久久99国产精品久久99| 日韩一级黄色片| 亚洲不卡av一区二区三区| 色美美综合视频| 一区二区三区四区不卡视频| av电影天堂一区二区在线| 国产精品五月天| 国产成人在线影院| 中文字幕欧美激情一区| 成人免费视频一区| 国产精品久久久久天堂| av电影天堂一区二区在线观看| 国产精品久久久久aaaa樱花| 国产不卡视频在线观看| 国产精品网曝门| 91亚洲精品久久久蜜桃| 亚洲欧美一区二区三区孕妇| 92国产精品观看| 亚洲免费观看高清在线观看| 91国内精品野花午夜精品| 亚洲综合成人在线视频| 欧美日本一区二区在线观看| 日本不卡视频在线观看| 日韩欧美一区在线观看| 久久机这里只有精品| 久久只精品国产| 不卡欧美aaaaa| 亚洲精品videosex极品| 欧美在线视频你懂得| 亚洲大片免费看| 日韩亚洲欧美综合| 国产精品91xxx| 亚洲天堂av老司机| 欧美日韩国产首页| 精品夜夜嗨av一区二区三区| 日本一区二区三区高清不卡 | 久久亚洲影视婷婷| 国产成人久久精品77777最新版本| 中文字幕一区免费在线观看 | 一区精品在线播放| 欧美私人免费视频| 国产一区二区三区精品欧美日韩一区二区三区| 欧美变态凌虐bdsm| hitomi一区二区三区精品| 亚洲在线中文字幕| 久久精品一级爱片| 欧美系列一区二区| 岛国一区二区三区| 日韩av电影免费观看高清完整版| 精品国产乱码91久久久久久网站| 成人av在线影院| 日韩va欧美va亚洲va久久| 欧美国产精品一区二区三区| 欧洲一区二区三区在线| 国产美女精品一区二区三区| 亚洲激情自拍偷拍| 国产三级欧美三级日产三级99 | 亚洲午夜免费视频| 欧美一级久久久| 色综合久久久久综合99| 麻豆一区二区三区| 亚洲二区视频在线| 欧美激情自拍偷拍| 日韩欧美激情四射| 欧美视频在线播放| 不卡一区在线观看| 国产一区美女在线| 日韩电影在线观看网站| 亚洲少妇30p| 久久精品亚洲精品国产欧美kt∨ | 欧美成人女星排名| 欧美色网一区二区| 色香蕉成人二区免费| 国产成人亚洲综合色影视| 偷窥少妇高潮呻吟av久久免费| 国产精品伦理一区二区| 久久影院视频免费| 日韩欧美的一区| 欧美高清视频不卡网| 在线欧美日韩精品| 91久久香蕉国产日韩欧美9色| 成人性视频免费网站| 国产在线麻豆精品观看| 麻豆成人综合网| 日韩不卡一区二区三区| 天天色 色综合| 亚洲成人第一页| 亚洲午夜久久久| 亚洲大片一区二区三区| 亚洲国产一区二区视频| 亚洲影视资源网| 亚洲已满18点击进入久久| 亚洲综合在线第一页| 一区二区理论电影在线观看| 亚洲男帅同性gay1069| 中文字幕一区在线观看视频| 中文字幕日韩精品一区| 亚洲丝袜美腿综合| 日韩一区有码在线| 亚洲另类在线一区| 亚洲高清一区二区三区| 亚洲18女电影在线观看| 爽好久久久欧美精品| 日本欧美加勒比视频| 久久精品99久久久| 国产乱码精品1区2区3区| 国产不卡视频在线播放| 99久久伊人久久99| 欧洲一区在线电影| 3atv在线一区二区三区| 欧美α欧美αv大片| 久久久777精品电影网影网| 亚洲国产精品v| 一区二区三区欧美亚洲| 天天爽夜夜爽夜夜爽精品视频| 日本欧美一区二区| 国产寡妇亲子伦一区二区| www.亚洲免费av| 欧美三级电影在线观看| 日韩亚洲欧美中文三级| 久久综合九色欧美综合狠狠| 国产精品区一区二区三区| 亚洲综合一区二区三区| 久久成人免费电影| av资源网一区| 88在线观看91蜜桃国自产| 欧美精品一区二区三区久久久| 国产精品久久久久9999吃药| 丝袜亚洲另类欧美综合| 国产一区二三区| 色婷婷综合久久久| 精品日韩一区二区三区 | 日本午夜一本久久久综合| 国产精品一区二区在线观看不卡 | 性做久久久久久免费观看 | 日本一区二区免费在线观看视频| 亚洲男人天堂av网| 狠狠色丁香九九婷婷综合五月| 北条麻妃一区二区三区| 欧美精品久久一区| 一区在线观看免费| 国内久久精品视频| 在线日韩av片| 国产精品视频线看| 蜜桃视频一区二区三区| 日本道免费精品一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲| 一区二区三区在线视频播放| 狠狠色丁香久久婷婷综| 欧美日韩一二三| 亚洲色图丝袜美腿| 国产99久久精品| 欧美大黄免费观看| 亚洲成人三级小说| 色偷偷一区二区三区| 欧美激情中文字幕一区二区| 麻豆精品国产传媒mv男同| 在线观看日韩高清av| 国产精品久久久久影院亚瑟| 国产专区综合网| 欧美va亚洲va香蕉在线| 亚洲成人777| 91成人网在线| 一区二区视频在线看| 成人a级免费电影| 中文字幕国产一区| 国产精品一级在线| 久久综合精品国产一区二区三区 | 久久精品亚洲精品国产欧美 | 色婷婷亚洲一区二区三区| 日本一区二区三区免费乱视频| 国产一区二区在线电影| 日韩美女天天操| 麻豆精品国产91久久久久久| 欧美日韩另类国产亚洲欧美一级| 一区二区成人在线| 欧美做爰猛烈大尺度电影无法无天| 日韩美女久久久| 在线免费视频一区二区| 曰韩精品一区二区|