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

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

?? memmgr.cpp

?? 小型的操作系統(tǒng)開(kāi)發(fā)的原代碼
?? CPP
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(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;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩电影免费在线| 一区二区三区在线免费| 色噜噜狠狠色综合中国| 毛片一区二区三区| 亚洲精品久久久蜜桃| 精品国产乱码久久久久久蜜臀| 日本精品视频一区二区| 国产成人99久久亚洲综合精品| 舔着乳尖日韩一区| 国产精品午夜春色av| 精品国产一区二区亚洲人成毛片| 在线免费观看视频一区| 成人在线综合网站| 精油按摩中文字幕久久| 亚洲观看高清完整版在线观看| 中文字幕亚洲精品在线观看| 欧美videossexotv100| 欧美日韩国产成人在线免费| 99久免费精品视频在线观看| 亚洲视频电影在线| 亚洲国产成人一区二区三区| 欧美精品少妇一区二区三区| 成人午夜碰碰视频| 麻豆91精品视频| 亚洲国产一区二区视频| 中日韩免费视频中文字幕| 91香蕉视频黄| 国产一区二区影院| 亚洲国产日韩精品| 国产精品视频麻豆| 欧美不卡一二三| 日本韩国欧美三级| av电影天堂一区二区在线观看| 麻豆成人免费电影| 亚洲精品中文在线影院| 国产精品视频你懂的| 久久亚洲二区三区| 91精品国产黑色紧身裤美女| 在线观看亚洲专区| 一本大道久久精品懂色aⅴ| 国产福利精品一区二区| 精品亚洲欧美一区| 麻豆91免费观看| 美日韩一区二区| 五月天久久比比资源色| 一区二区三区欧美视频| 中文字幕中文乱码欧美一区二区| 精品久久99ma| 91麻豆精品一区二区三区| 成人免费的视频| 国产精品一区在线| 麻豆精品精品国产自在97香蕉| 偷拍与自拍一区| 亚洲成a人v欧美综合天堂下载| 亚洲精品视频自拍| 日韩久久一区二区| 亚洲欧洲精品天堂一级| 中文字幕一区二区三区乱码在线| 91.xcao| 91精品国产91热久久久做人人| 欧美日韩亚洲综合一区| 欧美色网站导航| 欧美日韩国产欧美日美国产精品| 丁香一区二区三区| 国产精品1区二区.| 国产一区二区免费看| 国产一区91精品张津瑜| 日本亚洲三级在线| 日韩av一区二区三区| 日韩在线观看一区二区| 日本不卡视频在线| 狠狠久久亚洲欧美| 高清不卡在线观看| 蜜臀91精品一区二区三区| 亚洲电影欧美电影有声小说| 亚洲国产一区二区a毛片| 一级精品视频在线观看宜春院| 亚洲国产日韩一区二区| 欧美精品一区二区高清在线观看| 亚洲欧美日韩国产成人精品影院| 国产精品污www在线观看| 日韩理论片网站| 午夜在线成人av| 奇米888四色在线精品| 国产麻豆精品一区二区| 看电影不卡的网站| 国产成人免费在线观看不卡| av不卡免费电影| 欧美一区三区四区| 久久综合久久综合久久| 最新日韩在线视频| 午夜精品福利视频网站| 色婷婷精品久久二区二区蜜臀av | 91黄色小视频| 欧美在线综合视频| 欧美浪妇xxxx高跟鞋交| 国产精品第五页| 亚洲天堂a在线| 日韩国产在线一| 日本中文在线一区| 美女视频一区二区| 日韩精品三区四区| 国产精品正在播放| 色香蕉成人二区免费| 久久久一区二区三区| 欧美一区二区三区的| 中文子幕无线码一区tr| 日本视频一区二区三区| 色久综合一二码| 国产精品国产精品国产专区不蜜| 久久精品国产精品亚洲精品| 亚洲国产成人在线| 亚洲一线二线三线视频| 成人一区二区三区在线观看| 欧美精品丝袜久久久中文字幕| 97se亚洲国产综合在线| 亚洲一区二区三区激情| 91啪在线观看| 一区二区三区四区在线免费观看| 欧美一级xxx| 欧美激情一二三区| 天天色图综合网| 成人国产电影网| 日韩欧美国产午夜精品| 国产欧美综合在线观看第十页| 中文字幕一区二区视频| 美女在线一区二区| 色综合 综合色| 7777精品伊人久久久大香线蕉超级流畅| 制服丝袜激情欧洲亚洲| 亚洲精品一区二区在线观看| 一片黄亚洲嫩模| 成人av免费在线| 久久精品在这里| 久久爱www久久做| 91色|porny| 欧美韩日一区二区三区四区| 精品一区精品二区高清| 欧美一区二区三区免费| 亚洲一区在线观看免费观看电影高清| 成人av资源站| 国产色综合一区| 韩国精品一区二区| 精品人在线二区三区| 亚洲成人免费在线| 在线看日本不卡| 樱花草国产18久久久久| 99久久精品国产毛片| 最新高清无码专区| 91麻豆国产福利精品| 亚洲欧洲无码一区二区三区| 成人综合婷婷国产精品久久免费| 国产无遮挡一区二区三区毛片日本| 狠狠色丁香婷婷综合| 日韩一区二区三区电影在线观看| 亚洲一区二区精品久久av| 97久久超碰精品国产| 欧美日韩国产bt| 亚洲h动漫在线| 欧美日韩一区不卡| 天天色天天爱天天射综合| 欧美精品99久久久**| 日本人妖一区二区| 欧美精品一区二区三区在线| 激情文学综合插| 国产日韩精品久久久| 成人午夜av在线| 亚洲日本中文字幕区| www.亚洲人| 一区二区三区在线视频播放| 精品视频1区2区| 久久黄色级2电影| 久久久精品tv| 91在线播放网址| 亚洲色欲色欲www| 欧美日韩一区二区三区四区五区| 天天操天天干天天综合网| 精品少妇一区二区三区免费观看| 亚洲成人精品影院| 欧美日韩中字一区| 美女视频第一区二区三区免费观看网站| 精品乱码亚洲一区二区不卡| 国产丶欧美丶日本不卡视频| 国产精品成人一区二区艾草 | 亚洲最色的网站| 欧美日韩免费一区二区三区视频| 免费在线看成人av| 久久色在线视频| 不卡视频在线看| 国产精品久久网站| 欧美日韩精品一区二区| 男人的j进女人的j一区| 日本一二三四高清不卡| 一本久久综合亚洲鲁鲁五月天| 亚洲人吸女人奶水| 粉嫩高潮美女一区二区三区| 亚洲欧美日韩在线| 欧美亚洲免费在线一区| 久久99热这里只有精品| 国产欧美日本一区二区三区|