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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? memmgr.cpp

?? 自己動(dòng)手寫操作系統(tǒng)源代碼,不可多得的代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號(hào):
	j = i;
	while(j < PAGE_FRAME_BLOCK_NUM)
	{
		if(NULL == lpFrameManager->FrameBlockArray[j].lpNextBlock)
		{
			j ++;
			continue;
		}
		else
			break;    //Find the fitable block list to allocate from.
	}

	if(PAGE_FRAME_BLOCK_NUM == j)  //There is not page frame block to fit the request.
	{
		//LEAVE_CRITICAL_SECTION();
		__LEAVE_CRITICAL_SECTION(NULL,dwFlags);
		goto __TERMINAL;
	}

	//
	//Now,we have found the block list countains the correct block,the block can fit the
	//request,so we delete the first block from the block list,spit it into more small
	//blocks,insert the less block into appropriate block list,and return one correct to
	//the caller.
	//
	lpPageFrame = lpFrameManager->FrameBlockArray[j].lpNextBlock;
	if(NULL != lpPageFrame->lpNextFrame)
		lpPageFrame->lpPrevFrame = NULL;
	lpFrameManager->FrameBlockArray[j].lpNextBlock = lpPageFrame->lpNextFrame; //Delete the block.

	dwOffset = (DWORD)lpPageFrame - (DWORD)lpFrameManager->lpPageFrameArray;
	k        = dwOffset / sizeof(__PAGE_FRAME);

	//
	//The return value can be calculated as following:
	//

	lpResult = (LPVOID)((DWORD)lpFrameManager->lpStartAddress + k * PAGE_FRAME_SIZE);
	k       /= (FrameBlockSize[j] / PAGE_FRAME_SIZE);
	ClearBitmapBit(lpFrameManager->FrameBlockArray[j].lpdwBitmap,k);  //Clear the bit.

	while(j > i)    //Split the block into more small block,and insert into block list.
	{
		k  = FrameBlockSize[j - 1] / PAGE_FRAME_SIZE;
		k *= sizeof(__PAGE_FRAME);
		lpTempFrame = (__PAGE_FRAME*)((DWORD)lpPageFrame + k);
		if(NULL != lpFrameManager->FrameBlockArray[j - 1].lpNextBlock)
		{
			lpFrameManager->FrameBlockArray[j - 1].lpNextBlock->lpPrevFrame = 
				lpTempFrame;
		}
		lpTempFrame->lpNextFrame = lpFrameManager->FrameBlockArray[j - 1].lpNextBlock;
		lpTempFrame->lpPrevFrame = NULL;
		lpFrameManager->FrameBlockArray[j - 1].lpNextBlock = lpTempFrame;
		dwOffset = (DWORD)lpTempFrame - (DWORD)lpFrameManager->lpPageFrameArray;
		k        = dwOffset / sizeof(__PAGE_FRAME);
		k       /= FrameBlockSize[j - 1] / PAGE_FRAME_SIZE;
		SetBitmapBit(lpFrameManager->FrameBlockArray[j - 1].lpdwBitmap,k);  //Set bit.
		j --;
	}

	//LEAVE_CRITICAL_SECTION();
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

__TERMINAL:
	return lpResult;
}

//
//FrameFree routine of PageFrameManager.
//The routine does the following:
// 1. Check the buddy block's status of the block which will be freed;
// 2. If the status of buddy block is free,then combine the two blocks,and 
//    insert the combined block into up level block list;
// 3. Check the up level block list,this is a recursive process.
//
//CAUTION: The dwSize parameter of this routine,must equal to the dwSize
//parameter of FrameAlloc routine of Page Frame Manager.
//

static VOID FrameFree(__COMMON_OBJECT*  lpThis,
					  LPVOID            lpStartAddr,
					  DWORD             dwSize)
{
	__PAGE_FRAME_MANAGER*               lpFrameManager  = NULL;
	__PAGE_FRAME*                       lpPageFrame     = NULL;
	__PAGE_FRAME*                       lpTempFrame     = NULL;
	DWORD                               i               = 0L;
	DWORD                               j               = 0L;
	DWORD                               k               = 0L;
	DWORD                               dwOffset        = 0L;
	DWORD                               dwFlags         = 0L;

	if((NULL == lpThis) || (NULL == lpStartAddr) ||
	   (0 == dwSize))   //Parameter check.
		goto __TERMINAL;

	if((DWORD)lpStartAddr % PAGE_FRAME_SIZE)   //The address is not page frame alignable.
		goto __TERMINAL;

	for(i = 0;i < PAGE_FRAME_BLOCK_NUM;i ++)
	{
		if(dwSize <= FrameBlockSize[i])
			break;
	}

	if(PAGE_FRAME_BLOCK_NUM == i)    //The dwSize is too large,invalid parameter.
		goto __TERMINAL;

	lpFrameManager = (__PAGE_FRAME_MANAGER*)lpThis;
	dwOffset       = (DWORD)lpStartAddr - (DWORD)lpFrameManager->lpStartAddress;
	k              = dwOffset / FrameBlockSize[i];  //The k-th block.

	lpPageFrame    = (__PAGE_FRAME*)((DWORD)lpFrameManager->lpPageFrameArray + 
		(dwOffset / PAGE_FRAME_SIZE) * sizeof(__PAGE_FRAME));    
	//Now,lpPageFrame pointes the page frame control block.

	if(k % 2)    //Get this block's buddy block index.
	{
		k -= 1;
	}
	else
	{
		k += 1;
	}

	//ENTER_CRITICAL_SECTION();
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);

	if(TestBit(lpFrameManager->FrameBlockArray[i].lpdwBitmap,k))  //If the current block's
		                                                          //buddy block also free,
																  //then combine the two blocks,
																  //and insert into up level
																  //block list.
	{
		while(i < PAGE_FRAME_BLOCK_NUM - 1)
		{
			if(k % 2)    //The behind block of lpPageFrame is it's buddy block.
			{
				lpTempFrame = (__PAGE_FRAME*)((DWORD)lpPageFrame + (FrameBlockSize[i] / 
					PAGE_FRAME_SIZE) * sizeof(__PAGE_FRAME));
				//lpLargeFrame = lpPageFrame;
			}
			else         //The previous block of lpPageFrame is it's buddy block.
			{
				lpTempFrame = (__PAGE_FRAME*)((DWORD)lpPageFrame - (FrameBlockSize[i] /
					PAGE_FRAME_SIZE) * sizeof(__PAGE_FRAME));
				//lpLargeFrame = lpTempFrame;
				lpPageFrame = lpTempFrame;
			}

			//The following code delete the buddy block from the current list,and insert
			//the combined block into up level block list.
			if(NULL == lpTempFrame->lpPrevFrame)    //This is the first block.
			{
				if(NULL == lpTempFrame->lpNextFrame)  //This is the last block.
				{
					//lpTempFrame->lpNextFrame->lpPrevFrame = NULL;
					lpFrameManager->FrameBlockArray[i].lpNextBlock = lpTempFrame->lpNextFrame;
				}
				else
				{
					lpTempFrame->lpNextFrame->lpPrevFrame = NULL;
					lpFrameManager->FrameBlockArray[i].lpNextBlock = lpTempFrame->lpNextFrame;
				}
			}
			else  //This is not the first block.
			{
				if(NULL == lpTempFrame->lpNextFrame) //This is the last block.
				{
					lpTempFrame->lpPrevFrame->lpNextFrame = NULL;
				}
				else  //This is not the last block.
				{
					lpTempFrame->lpPrevFrame->lpNextFrame = lpTempFrame->lpNextFrame;
					lpTempFrame->lpNextFrame->lpPrevFrame = lpTempFrame->lpPrevFrame;
				}
			}

			ClearBitmapBit(lpFrameManager->FrameBlockArray[i].lpdwBitmap,k);  //Clear bit.

			i ++;  //To check up level block link.

			k  = (DWORD)lpPageFrame - (DWORD)lpFrameManager->lpPageFrameArray;
			k /= sizeof(__PAGE_FRAME);
			k /= (FrameBlockSize[i] / PAGE_FRAME_SIZE);

			if(k % 2)
				k -= 1;
			else
				k += 1;

			if(!TestBit(lpFrameManager->FrameBlockArray[i].lpdwBitmap,k))
				break;
		}

		//
		//The following code inserts the combined block into up level block list.
		//

		if(NULL != lpFrameManager->FrameBlockArray[i].lpNextBlock)
		{
			lpFrameManager->FrameBlockArray[i].lpNextBlock->lpPrevFrame = 
				lpPageFrame;
		}
		lpPageFrame->lpNextFrame = lpFrameManager->FrameBlockArray[i].lpNextBlock;
		lpPageFrame->lpPrevFrame = NULL;

		lpFrameManager->FrameBlockArray[i].lpNextBlock = lpPageFrame;

		if(k % 2)    //Adjust k.
			k -= 1;
		else
			k += 1;

		SetBitmapBit(lpFrameManager->FrameBlockArray[i].lpdwBitmap,k); //Set bit.
	}
	else      //The buddy of the current block is occupied.
		      //So,only insert the current block into the block
			  //list.
	{
		if(NULL != lpFrameManager->FrameBlockArray[i].lpNextBlock)
		{
			lpFrameManager->FrameBlockArray[i].lpNextBlock->lpPrevFrame = 
				lpPageFrame;
		}
		lpPageFrame->lpNextFrame = lpFrameManager->FrameBlockArray[i].lpNextBlock;
		lpPageFrame->lpPrevFrame = NULL;

		lpFrameManager->FrameBlockArray[i].lpNextBlock = lpPageFrame;

		if(k % 2)    //Adjust k.
			k -= 1;
		else
			k += 1;

		SetBitmapBit(lpFrameManager->FrameBlockArray[i].lpdwBitmap,k);  //Set bit.
	}

	//LEAVE_CRITICAL_SECTION();
	__LEAVE_CRITICAL_SECTION(NULL,dwFlags);

__TERMINAL:
	return;
}

/*************************************************************************
**************************************************************************
**************************************************************************
**************************************************************************
*************************************************************************/

//
//The definition of object PageFrameManager.
//

__PAGE_FRAME_MANAGER PageFrameManager = {
	NULL,                                  //lpPageFrameArray.
	{0},                                   //FrameBlockArray.
	0L,                                    //dwTotalFrameNum.
	0L,                                    //dwFreeFrameNum.
	NULL,                                  //lpStartAddress.
	PageFrameMgrInit,                      //Initialize routine.
	FrameAlloc,                            //FrameAlloc routine.
	FrameFree                              //FrameFree routine.
};

//------------------------------------------------------------------------
//
//    The implementation code of Memory Manager.
//
//------------------------------------------------------------------------

//
//The implementation of Initialize routine of Memory Manager.
//The routine does the following:
// 1. Set all Memory Descriptor Entry's status to FREE (VM_DESCRIPTOR_FLAG_FREE);
//
//Then return.
//

static BOOL MemMgrInitialize(__COMMON_OBJECT*    lpThis)
{
	BOOL                             bResult     = FALSE;
	__MEMORY_MANAGER*                lpMemoryMgr = NULL;
	DWORD                            i           = 0L;

	if(NULL == lpThis)
		return bResult;

	lpMemoryMgr = (__MEMORY_MANAGER*)lpThis;

	for(i = 0;i < MAX_KERNEL_THREAD_NUM;i ++)
	{
		lpMemoryMgr->MemDescArray[i].dwDescriptorFlag |= VM_DESCRIPTOR_FLAG_FREE;
	}

	bResult = TRUE;

	return bResult;
}

//
//The implementation of ReserveDescIndex routine.
//The routine does the following:
// 1. Check all memory descriptor,to find a free one;
// 2. If can not find a free descriptor,then return INVALID_DESC_INDEX;
// 3. If find a free descriptor,then set the descriptor's status to OCCUPIED,
//    and return the index to caller.
//

static DWORD ReserveDescIndex(__COMMON_OBJECT*    lpThis)
{
	DWORD                     dwDescIndex         = INVALID_DESC_INDEX;
	__MEMORY_MANAGER*         lpMemManager        = NULL;
	DWORD                     i                   = 0L;
	DWORD                     dwFlags             = 0L;

	if(NULL == lpThis)
		return dwDescIndex;

	lpMemManager = (__MEMORY_MANAGER*)lpThis;

	//ENTER_CRITICAL_SECTION();    //The following must not be interrupted.
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);

	for(i = 0;i < MAX_KERNEL_THREAD_NUM;i ++)
	{
		if(lpMemManager->MemDescArray[i].dwDescriptorFlag & VM_DESCRIPTOR_FLAG_FREE)
			//Find a descriptor whose status is FREE.
		{
			dwDescIndex = i;
			//
			//Clear the free bit of this descriptor.
			//
			lpMemManager->MemDescArray[i].dwDescriptorFlag &= ~VM_DESCRIPTOR_FLAG_FREE;

			lpMemManager->MemDescArray[i].lpChunkListRoot  = NULL;
			lpMemManager->MemDescArray[i].lpChunkTreeRoot  = NULL;
			lpMemManager->MemDescArray[i].wChunkNum        = 0;
			lpMemManager->MemDescArray[i].wHeapNum         = 0;
			break;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品国产免费看久久精品| 91精品麻豆日日躁夜夜躁| 在线观看日韩毛片| 欧美一区二区三区在| 久久久久高清精品| 亚洲欧美一区二区三区国产精品 | 成人动漫一区二区| 欧美性欧美巨大黑白大战| 精品国产精品一区二区夜夜嗨| 中文字幕亚洲综合久久菠萝蜜| 婷婷丁香激情综合| 国产成人亚洲精品青草天美| 欧美丝袜丝交足nylons| 久久久久久亚洲综合影院红桃| 亚洲精品v日韩精品| 精久久久久久久久久久| 日本精品免费观看高清观看| 精品美女一区二区三区| 一区二区三区四区中文字幕| 久久草av在线| 欧美中文字幕亚洲一区二区va在线| 欧美精品一区二区三区高清aⅴ| 亚洲视频一区二区免费在线观看| 男女男精品网站| 91在线观看一区二区| 亚洲精品一区二区三区影院| 伊人开心综合网| 国产精品一二三| 91精品一区二区三区在线观看| 国产精品美女一区二区三区| 奇米888四色在线精品| 色婷婷国产精品综合在线观看| 精品成人佐山爱一区二区| 亚洲风情在线资源站| 成人深夜在线观看| 精品国产三级a在线观看| 亚洲成人在线网站| 91视频你懂的| 国产欧美一区二区精品仙草咪| 视频在线观看91| 色婷婷久久久久swag精品| 欧美国产丝袜视频| 国内成人免费视频| 欧美一级久久久久久久大片| 亚洲一区视频在线观看视频| 成人动漫一区二区在线| 精品国产乱码久久| 麻豆视频观看网址久久| 欧美色网一区二区| 一区二区三区在线观看动漫| eeuss鲁片一区二区三区| 国产亚洲欧美一级| 国产麻豆91精品| 日韩欧美一级二级| 日本美女视频一区二区| 欧美日韩欧美一区二区| 亚洲激情自拍偷拍| 91视频观看免费| 国产精品成人免费| eeuss鲁一区二区三区| 中文字幕av一区二区三区| 国产成人免费在线| 精品久久久久久亚洲综合网| 日本视频在线一区| 日韩三级.com| 麻豆国产91在线播放| 日韩欧美一区二区视频| 日韩1区2区日韩1区2区| 7777精品久久久大香线蕉| 日韩经典中文字幕一区| 欧美一区二区三区视频免费 | 欧美日韩国产影片| 亚洲大片免费看| 欧美色图片你懂的| 亚洲gay无套男同| 欧美三级在线看| 性感美女久久精品| 91精品国产综合久久福利软件| 天天影视涩香欲综合网 | 激情图区综合网| 日韩免费成人网| 国产一区二区三区免费看| 久久久久久一级片| 成人激情视频网站| 亚洲欧美日韩国产另类专区| 色婷婷一区二区三区四区| 亚洲一区二区三区四区在线观看 | 亚洲韩国精品一区| 欧美日韩国产小视频| 免费成人在线播放| 国产午夜精品久久久久久免费视 | 亚洲免费av高清| 欧美日韩一区 二区 三区 久久精品| 亚洲午夜精品一区二区三区他趣| 欧美日韩国产精品成人| 免费高清不卡av| 国产午夜亚洲精品不卡| 不卡欧美aaaaa| 一区二区高清在线| 欧美区一区二区三区| 美女视频网站黄色亚洲| 欧美激情一区在线观看| 91玉足脚交白嫩脚丫在线播放| 亚洲成人午夜影院| 亚洲精品一区二区三区精华液| 国产99久久久国产精品潘金| 亚洲欧美激情在线| 日韩欧美高清在线| 成人app下载| 日精品一区二区三区| 久久久久久久精| 色成人在线视频| 韩国欧美国产1区| 亚洲日本电影在线| 日韩亚洲欧美在线| 成人久久久精品乱码一区二区三区| 一区二区三区在线免费播放| 日韩欧美一区二区视频| av电影天堂一区二区在线观看| 亚洲va天堂va国产va久| 国产欧美一区二区精品久导航 | 亚洲成a人片综合在线| 久久这里只精品最新地址| 99在线精品观看| 美国欧美日韩国产在线播放| 亚洲日本va在线观看| 日韩精品一区二| 97se亚洲国产综合自在线不卡| 免费看精品久久片| 亚洲精品亚洲人成人网| 久久―日本道色综合久久| 欧美日韩亚洲高清一区二区| 成人亚洲一区二区一| 日本成人中文字幕在线视频| 中文字幕在线不卡一区| 日韩欧美国产综合一区| 91视视频在线观看入口直接观看www| 午夜精品久久久久久久久久久 | www.欧美.com| 麻豆精品视频在线| 亚洲一线二线三线视频| 国产欧美精品在线观看| 欧美一区二区二区| 日本高清不卡在线观看| 成人动漫中文字幕| 国产麻豆精品一区二区| 日韩不卡免费视频| 亚洲图片欧美色图| ㊣最新国产の精品bt伙计久久| 精品国产伦理网| 911国产精品| 91久久免费观看| 成人精品免费网站| 国产一区二区三区免费播放| 日本美女一区二区| 香蕉成人伊视频在线观看| 亚洲精品视频免费观看| 国产精品无人区| 久久久久九九视频| 2020日本不卡一区二区视频| 欧美一区二区三区啪啪| 欧美中文字幕一区二区三区亚洲| 大美女一区二区三区| 国产成人亚洲综合a∨婷婷图片| 麻豆极品一区二区三区| 日韩精品一卡二卡三卡四卡无卡| 亚洲一区在线观看免费观看电影高清 | 亚洲少妇最新在线视频| 国产精品入口麻豆原神| 久久久99精品免费观看不卡| 日韩精品一区二区三区三区免费| 777午夜精品免费视频| 欧美日韩国产在线播放网站| 欧美亚洲尤物久久| 欧美伊人精品成人久久综合97 | 天天操天天干天天综合网| 亚洲高清视频在线| 亚洲自拍偷拍欧美| 一区二区三区影院| 亚洲一区二区视频在线| 亚洲成人精品一区二区| 亚洲va中文字幕| 日一区二区三区| 蜜臀精品久久久久久蜜臀| 久热成人在线视频| 久久国产精品99精品国产| 精品一区二区三区在线观看| 精品一区二区三区在线观看国产| 国产一区二区免费视频| 国产精品综合久久| 福利91精品一区二区三区| av一二三不卡影片| 色999日韩国产欧美一区二区| 欧美在线免费播放| 欧美日韩另类一区| 日韩美女在线视频| 国产欧美日韩三区| 亚洲欧洲日韩在线| 亚洲与欧洲av电影| 免费xxxx性欧美18vr|