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

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

?? memmgr.cpp

?? 自己動手寫操作系統源代碼,不可多得的代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
//***********************************************************************/
//    Author                    : Garry
//    Original Date             : Mar,09 2005
//    Module Name               : memmgr.cpp
//    Module Funciton           : 
//                                This module countains 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

//------------------------------------------------------------------------
//
//    The implementation code of Page Frame Manager.
//
//------------------------------------------------------------------------

static DWORD FrameBlockSize[] = {    //This array is used to locate the page frame block's
	                                 //size according to it's index.
	PAGE_FRAME_BLOCK_SIZE_4K,
	PAGE_FRAME_BLOCK_SIZE_8K,

	PAGE_FRAME_BLOCK_SIZE_16K,
	PAGE_FRAME_BLOCK_SIZE_32K,
	PAGE_FRAME_BLOCK_SIZE_64K,

	PAGE_FRAME_BLOCK_SIZE_128K,
	PAGE_FRAME_BLOCK_SIZE_256K,
	PAGE_FRAME_BLOCK_SIZE_512K,

	PAGE_FRAME_BLOCK_SIZE_1024K,
	PAGE_FRAME_BLOCK_SIZE_2048K,
	PAGE_FRAME_BLOCK_SIZE_4096K,
	PAGE_FRAME_BLOCK_SIZE_8192K
};

//
//Align one address to page frame boundary.
//

#define ALIGN_DOWN_TO_PAGE(address) \
    (LPVOID)(((DWORD)(address) % PAGE_FRAME_SIZE) ? ((DWORD)(address) + \
    (PAGE_FRAME_SIZE - (DWORD)(address) % PAGE_FRAME_SIZE)) : (DWORD)(address))

#define ALIGN_UP_TO_PAGE(address) \
    (LPVOID)(((DWORD)(address) % PAGE_FRAME_SIZE) ? ((DWORD)(address) - \
	(DWORD)(address) % PAGE_FRAME_SIZE) : (DWORD)(address))

//
//The following are some helper routines,used by the member functions of PageFrameManager.
//

//
//Set one bit in bit map,the bit's position is determined by dwBitPos.
//

static VOID SetBitmapBit(DWORD* lpdwBitmap,DWORD dwBitPos)
{
	DWORD*    lpdwMap    = NULL;
	DWORD     dwPos      = 0L;
	DWORD     dwBitZero  = 0x00000001;

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

	lpdwMap  = lpdwBitmap;
	lpdwMap += dwBitPos / (sizeof(DWORD)*8);  //Now,lpdwMap pointes to the
	                                          //DWORD the target bit exists.
	dwPos = dwBitPos % (sizeof(DWORD)*8);
	dwBitZero <<= dwPos;

	*lpdwMap |= dwBitZero;  //Set the target bit.
}

//
//Clear one bit in bit map,the bit's position is determined by dwBitPos.
//

static VOID ClearBitmapBit(DWORD* lpdwBitmap,DWORD dwBitPos)
{
	DWORD*    lpdwMap    = NULL;
	DWORD     dwPos      = 0L;
	DWORD     dwBitZero  = 0x00000001;

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

	lpdwMap  = lpdwBitmap;
	lpdwMap += dwBitPos / (sizeof(DWORD)*8);  //Now,lpdwMap pointes to the
	                                          //DWORD the target bit exists.
	dwPos = dwBitPos % (sizeof(DWORD)*8);
	dwBitZero <<= dwPos;

	*lpdwMap &= ~dwBitZero;  //Set the target bit.
}

//
//TestBit routine.
//The routine tests the bit whose position is indicated by dwBitPos,if the bit is one,then
//returns TRUE,else,returns FALSE.
//

static BOOL TestBit(DWORD* lpdwBitmap,DWORD dwBitPos)
{
	DWORD*                 lpdwMap     = NULL;
	DWORD                  dwBitZero   = 0x00000001;
	DWORD                  dwPos       = 0L;

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

	lpdwMap = lpdwBitmap;
	dwPos   = dwBitPos;

	lpdwMap += dwPos / (sizeof(DWORD) * 8);  //Now,lpdwMap pointes to the double word
	                                         //that the bit to be tested exists.
	dwPos      %= (sizeof(DWORD) * 8);
	dwBitZero <<= dwPos;

	if(*lpdwMap & dwBitZero)  //Bit is one.
		return TRUE;
	
	return FALSE;
}

//
//Initialize routine.
//The routine does the following:
// 1. Calculate total page frame numbers,and initializes the members of page frame manager,
// 2. Allocate a block of kernel memory,as page frame array,and initializes it;
// 3. Allocate a block of kernel memory,as page frame block bit map;
// 4. Split the physical memory into page frame blocks,and inserts them into page frame
//    block list;
// 5. If all above steps successfully,then return TRUE,else,return FALSE.
//

//
//The lpStartAddr is the start address of linear memory space,and the lpEndAddr is the
//end address of linear address space.
//For example:
//
//    -------------
//    |           |   <----- lpStartAddr
//    |           |
//    |           |
//       ... ...   
//    |           |
//    |           |   <----- lpEndAddr
//    -------------
//
// If the lpStartAddr is 0x00100000,and the memory's size is 4M,then,the lpEndAddr must be
// 0x004FFFFF,not 0x00500000.
//
// If the lpStartAddr and the lpEndAddr's value does not align with 4K boundary,then the
// routine will round them to 4k boundary.
//

static BOOL PageFrameMgrInit(__COMMON_OBJECT*  lpThis,
							 LPVOID            lpStartAddr,
							 LPVOID            lpEndAddr)
{
	__PAGE_FRAME_MANAGER*        lpFrameManager      = NULL;
	BOOL                         bResult             = FALSE;
	LPVOID                       lpStartAddress      = NULL;
	LPVOID                       lpEndAddress        = NULL;
	DWORD                        dwPageNum           = 0L;
	__PAGE_FRAME*                lpPageFrameArray    = NULL;
	DWORD                        i                   = 0L;
	DWORD                        j                   = 0L;
	DWORD                        k                   = 0L;
	DWORD                        dwTotalMemLen       = 0L;
	DWORD                        dwIndBase           = 0L;

	if(NULL == lpThis)    //Parameters check.
		goto __TERMINAL;

	lpFrameManager = (__PAGE_FRAME_MANAGER*)lpThis;
	lpStartAddress = ALIGN_DOWN_TO_PAGE(lpStartAddr);
	lpEndAddress   = (LPVOID)((DWORD)lpEndAddr + 1);    //Adjust the end address.
	lpEndAddress   = ALIGN_UP_TO_PAGE(lpEndAddress);
	
	if((DWORD)((DWORD)lpEndAddress - (DWORD)lpStartAddress) < PAGE_FRAME_SIZE)
		goto __TERMINAL;

	dwPageNum = ((DWORD)lpEndAddress - (DWORD)lpStartAddress) / PAGE_FRAME_SIZE;
	lpPageFrameArray = (__PAGE_FRAME*)KMemAlloc(dwPageNum * sizeof(__PAGE_FRAME),
		KMEM_SIZE_TYPE_ANY);
	if(NULL == lpPageFrameArray)    //Failed to allocate memory.
		goto __TERMINAL;

	//
	//Initializes the members of page frame manager.
	//

	lpFrameManager->lpStartAddress   = lpStartAddress;
	lpFrameManager->dwTotalFrameNum  = dwPageNum;
	lpFrameManager->dwFreeFrameNum   = dwPageNum;
	lpFrameManager->lpPageFrameArray = lpPageFrameArray;

	//--------------- ** debug ** --------------------------
	//printf("Initialize: Total Page Frame number : %d\r\n",dwPageNum);
	//printf("Initialize: Start Address at        : %d\r\n",(DWORD)lpStartAddress);
	//printf("Initialize: Page Frame Array base   : %d\r\n",(DWORD)lpPageFrameArray);

	for(i = 0;i < PAGE_FRAME_BLOCK_NUM;i ++)    //Initialize all bitmap to NULL.
	{
		lpFrameManager->FrameBlockArray[i].lpdwBitmap  = NULL;
		lpFrameManager->FrameBlockArray[i].lpNextBlock = NULL;
		lpFrameManager->FrameBlockArray[i].lpPrevBlock = NULL;
	}

	//
	//The following code initializes the bitmap of page frame block.
	//

	for(i = 0;i < PAGE_FRAME_BLOCK_NUM;i ++)
	{
		//dwPageNum /= sizeof(DWORD);
		lpFrameManager->FrameBlockArray[i].lpdwBitmap = (DWORD*)KMemAlloc((dwPageNum / sizeof(DWORD)
			+ 1)*sizeof(DWORD),KMEM_SIZE_TYPE_ANY);
		if(NULL == lpFrameManager->FrameBlockArray[i].lpdwBitmap)  //Failed to allocate memory.
			goto __TERMINAL;
		for(j = 0;j < (dwPageNum/sizeof(DWORD) + 1)*sizeof(DWORD);j ++)  //Clear to zero.
			((UCHAR*)lpFrameManager->FrameBlockArray[i].lpdwBitmap)[j] = 0;

		if(0 == dwPageNum)
			break;

		dwPageNum /= 2;
	}

	//
	//The following code splits the whole physical memory into page frame blocks,and insert
	//them into page frame block list of Page Frame Manager.
	//

	dwTotalMemLen = lpFrameManager->dwTotalFrameNum * PAGE_FRAME_SIZE;
	dwIndBase     = 0L;
	for(i = PAGE_FRAME_BLOCK_NUM;i > 0;i --)
	{
		j = dwTotalMemLen / FrameBlockSize[i - 1];
		k = FrameBlockSize[i - 1] / PAGE_FRAME_SIZE;
		while(j)  //Insert the block into list.
		{
			j --;
			if(lpFrameManager->FrameBlockArray[i - 1].lpNextBlock)
			{
				lpFrameManager->FrameBlockArray[i - 1].lpNextBlock->lpPrevFrame = 
					&(lpFrameManager->lpPageFrameArray[dwIndBase + j * k]);
			}
			lpFrameManager->lpPageFrameArray[dwIndBase + j * k].lpNextFrame = 
				lpFrameManager->FrameBlockArray[i - 1].lpNextBlock;
			lpFrameManager->lpPageFrameArray[dwIndBase + j * k].lpPrevFrame = 
				NULL;

			lpFrameManager->FrameBlockArray[i - 1].lpNextBlock = 
				&(lpFrameManager->lpPageFrameArray[dwIndBase + j * k]);

			//
			//Set the appropriate bitmap bit,to indicate the block exists.
			//
			SetBitmapBit(lpFrameManager->FrameBlockArray[i - 1].lpdwBitmap,
				dwIndBase / k + j);
		}
		j = dwTotalMemLen / FrameBlockSize[i - 1];
		dwIndBase += j * k;
		dwTotalMemLen -= j * FrameBlockSize[i - 1];

	}

	bResult = TRUE;    //Set the successful initialization flag.

__TERMINAL:
	if(!bResult)    //Failed to initialize the object.
	{
		if(lpFrameManager->lpPageFrameArray)
			KMemFree((LPVOID)lpFrameManager->lpPageFrameArray,KMEM_SIZE_TYPE_ANY,0L);
		for(i = 0;i < PAGE_FRAME_BLOCK_NUM;i ++)
		{
			if(lpFrameManager->FrameBlockArray[i].lpdwBitmap)
				KMemFree((void*)lpFrameManager->FrameBlockArray[i].lpdwBitmap,
				KMEM_SIZE_TYPE_ANY,0L);
		}
	}
	return bResult;
}

//
//FrameAlloc routine of PageFrameManager.
//The routine does the following:
// 1. Try to find a page frame block statisfy the request;
// 2. If can not find this kind of block,return NULL;
// 3. If can find this kind of block,then split the block into more small block(if
//    need),and insert the more small block into appropriate block list;
// 4. Update the appropriate bit of bitmap;
// 5. Return the result.
//
//CAUTION: The dwSize parameter must equal to the corresponding parameter of
//FrameFree routine of Page Frame Manager.
//

static LPVOID FrameAlloc(__COMMON_OBJECT* lpThis,
						 DWORD            dwSize,
						 DWORD            dwPageFrameFlag)
{
	__PAGE_FRAME_MANAGER*        lpFrameManager  = NULL;
	DWORD                        dwBlockIndex    = 0L;
	BOOL                         bFind           = TRUE;
	LPVOID                       lpResult        = NULL;
	DWORD                        i               = 0L;
	DWORD                        j               = 0L;
	DWORD                        k               = 0L;
	DWORD                        dwOffset        = 0L;
	__PAGE_FRAME*                lpPageFrame     = NULL;
	__PAGE_FRAME*                lpTempFrame     = NULL;
	DWORD                        dwFlags         = 0L;

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

	if(dwSize > FrameBlockSize[PAGE_FRAME_BLOCK_NUM - 1]) //Request a too large block.
		goto __TERMINAL;

	lpFrameManager = (__PAGE_FRAME_MANAGER*)lpThis;

	for(i = 0;i < PAGE_FRAME_BLOCK_NUM;i ++)
	{
		if(dwSize <= FrameBlockSize[i])    //Find which block list satisfy the request.
			break;
	}

	//ENTER_CRITICAL_SECTION(); //The following operation is a atomic operation.
	__ENTER_CRITICAL_SECTION(NULL,dwFlags);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品免费国产二区三区| 亚洲国产精品久久不卡毛片 | 亚洲一二三级电影| 国产精品综合网| 欧美视频一二三区| 中文字幕永久在线不卡| 国产一区不卡视频| 欧美群妇大交群中文字幕| 亚洲视频1区2区| 成人在线综合网| 久久在线观看免费| 久久97超碰色| 日韩精品中文字幕一区| 青青草国产成人av片免费 | 国产二区国产一区在线观看| 欧美性欧美巨大黑白大战| 国产精品高潮久久久久无| 激情五月激情综合网| 欧美日本在线播放| 污片在线观看一区二区| 在线观看亚洲a| 亚洲一区二区三区三| 91蝌蚪porny九色| 国产精品乱码妇女bbbb| 高清不卡在线观看| 久久免费美女视频| 国产精品一区二区x88av| 久久久另类综合| 国产成人免费在线视频| 性感美女极品91精品| 色国产精品一区在线观看| 亚洲免费观看高清完整版在线| caoporn国产一区二区| 国产精品理论片在线观看| www.一区二区| 国产精品第13页| 91亚洲精品一区二区乱码| 亚洲特黄一级片| 一本一道久久a久久精品| 亚洲伦在线观看| 欧洲精品中文字幕| 舔着乳尖日韩一区| 日韩欧美激情一区| 国产成人三级在线观看| 国产精品国产三级国产aⅴ入口| 99国内精品久久| 一区二区欧美国产| 日韩视频在线永久播放| 久久99精品国产.久久久久久 | 国产精品大尺度| 91丨九色丨尤物| 亚洲国产日韩在线一区模特| 欧美高清视频不卡网| 国产乱子伦视频一区二区三区| 国产精品拍天天在线| 色综合色综合色综合| 三级久久三级久久久| 久久综合九色综合久久久精品综合| 国产精品一区专区| 亚洲精品国产品国语在线app| 欧美精品aⅴ在线视频| 国内成人自拍视频| 亚洲美腿欧美偷拍| 日韩一区二区三区免费看| 成人免费精品视频| 午夜精品久久久| 国产三级精品三级| 欧美喷潮久久久xxxxx| 国产精品99久久久久久宅男| 日韩毛片高清在线播放| 3atv一区二区三区| 成人免费视频app| 无吗不卡中文字幕| 成人欧美一区二区三区白人| 欧美精品 国产精品| 99热国产精品| 男女男精品网站| 亚洲人成伊人成综合网小说| 精品三级在线观看| 欧洲亚洲精品在线| 成人涩涩免费视频| 毛片一区二区三区| 夜夜嗨av一区二区三区网页| 2021中文字幕一区亚洲| 91福利国产成人精品照片| 国产米奇在线777精品观看| 丝袜诱惑制服诱惑色一区在线观看 | 国产欧美视频一区二区三区| 欧美怡红院视频| 成人av资源网站| 久久激情综合网| 午夜视频久久久久久| 亚洲欧洲日产国产综合网| 久久亚洲一级片| 欧美一级黄色片| 欧美在线观看视频在线| 91天堂素人约啪| 波多野结衣中文字幕一区二区三区| 奇米精品一区二区三区在线观看一| 亚洲女同一区二区| 中文字幕一区二| 中文字幕欧美三区| 久久久久国产精品麻豆ai换脸| 666欧美在线视频| 欧美日高清视频| 欧美丰满少妇xxxbbb| 欧洲av在线精品| 欧美影视一区在线| 欧美日韩一二区| 91麻豆精品视频| 91欧美一区二区| k8久久久一区二区三区| 成人18精品视频| 成人精品亚洲人成在线| 成人av网址在线观看| 国产成人免费av在线| 国产福利视频一区二区三区| 国产一区二区调教| 高清国产午夜精品久久久久久| 国产高清亚洲一区| 国产91在线观看丝袜| 国产一区二区三区久久悠悠色av| 国产真实精品久久二三区| 国产一区二区三区免费看| 国产精品一线二线三线精华| 成人精品视频一区二区三区尤物| 成人精品视频网站| 在线观看日韩一区| 欧美一区国产二区| 精品国产一区二区精华| 国产午夜精品一区二区三区嫩草| 久久精品亚洲一区二区三区浴池| 国产三级一区二区| 亚洲图片激情小说| 午夜精品福利视频网站| 久久av资源网| 白白色 亚洲乱淫| 欧美视频在线一区| 日韩亚洲欧美高清| 国产喷白浆一区二区三区| 中文字幕一区二区三区在线播放 | 麻豆91在线观看| 国产精品一区二区无线| 色综合天天天天做夜夜夜夜做| 欧美视频日韩视频| 久久久久国产一区二区三区四区 | 美女高潮久久久| 不卡视频在线看| 欧美喷水一区二区| 国产女人18水真多18精品一级做| 亚洲国产aⅴ成人精品无吗| 另类小说视频一区二区| 欧美一卡二卡在线| 最近日韩中文字幕| 久久激情五月婷婷| 色视频欧美一区二区三区| 91精品国产91综合久久蜜臀| 国产精品久久久久久久午夜片| 性做久久久久久久免费看| 国产成人av在线影院| 9191精品国产综合久久久久久| 国产精品欧美极品| 精品一区二区三区影院在线午夜 | 国产·精品毛片| 欧美日韩三级一区| 亚洲欧洲日韩在线| 国模大尺度一区二区三区| 欧美性一级生活| 中文乱码免费一区二区| 精品一区二区三区免费观看 | 2欧美一区二区三区在线观看视频| 中文字幕亚洲成人| 国产乱一区二区| 日韩一区二区影院| 午夜影院在线观看欧美| 成人免费看的视频| 久久久不卡影院| 免费成人深夜小野草| 欧美日韩卡一卡二| 一个色在线综合| 99vv1com这只有精品| 国产日韩欧美一区二区三区综合| 免费看欧美女人艹b| 欧美午夜一区二区三区免费大片| 国产精品欧美久久久久一区二区| 麻豆精品视频在线| 日韩欧美电影一区| 日本va欧美va精品发布| 欧美另类高清zo欧美| 亚洲午夜激情av| 91久久精品国产91性色tv| 亚洲欧美另类小说视频| 91丨porny丨最新| 最好看的中文字幕久久| 99在线精品观看| 亚洲欧美激情视频在线观看一区二区三区| 国产精品99久久久久久久女警| 欧美tickle裸体挠脚心vk| 久久国产精品无码网站| 精品国内二区三区|