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

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

?? memmgr.cpp

?? 自己動手寫操作系統(tǒng)源代碼,不可多得的代碼
?? 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 "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);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人高清在线视频| 欧美96一区二区免费视频| 高清不卡在线观看av| 精品国产1区2区3区| 国产最新精品免费| 国产日韩精品久久久| 波多野结衣欧美| 亚洲综合视频在线| 91精品国产手机| 国产裸体歌舞团一区二区| 国产精品免费视频网站| 91美女视频网站| 奇米精品一区二区三区在线观看一| 欧美成人综合网站| 成人app网站| 亚洲成人动漫av| 26uuu国产在线精品一区二区| 国产大片一区二区| 一区二区三区国产| 欧美大片一区二区| 国产91精品入口| 亚洲一级二级三级在线免费观看| 69成人精品免费视频| 国产精品一色哟哟哟| 亚洲免费在线视频| 欧美成人乱码一区二区三区| 成人禁用看黄a在线| 亚洲高清视频中文字幕| 精品av久久707| 日本韩国精品在线| 激情欧美日韩一区二区| 亚洲欧洲av一区二区三区久久| 欧美日韩国产免费一区二区| 麻豆成人av在线| 一区在线播放视频| 精品理论电影在线观看| 99精品视频在线观看免费| 免费成人av在线播放| 亚洲欧美日韩国产中文在线| 欧美xxxxxxxxx| 欧美性生活大片视频| 国产成人综合网站| 视频一区视频二区中文| 国产精品国产三级国产| 在线成人高清不卡| 色综合激情久久| 国产.精品.日韩.另类.中文.在线.播放| 亚洲综合另类小说| 国产精品国产自产拍在线| 欧美一区日本一区韩国一区| 色天使色偷偷av一区二区| 狠狠色丁香婷婷综合久久片| 亚洲五码中文字幕| 国产精品国产三级国产a| 精品久久久久久最新网址| 欧美午夜精品久久久久久孕妇| 国产91精品一区二区麻豆亚洲| 毛片一区二区三区| 天堂午夜影视日韩欧美一区二区| 亚洲三级免费观看| 亚洲欧美一区二区视频| 国产欧美一区二区三区在线看蜜臀 | 国产精品久久久一本精品 | xvideos.蜜桃一区二区| 欧美日韩卡一卡二| 在线精品视频一区二区三四| 丰满少妇久久久久久久 | 国产成人精品www牛牛影视| 久久99精品视频| 久久不见久久见免费视频7| 日本欧美一区二区三区乱码| 日韩高清一区在线| 日韩精品五月天| 奇米色一区二区| 美国三级日本三级久久99| 青青草97国产精品免费观看 | 精品一区二区av| 日本欧美一区二区| 免费不卡在线观看| 精品一区二区久久| 国产一区二区三区久久久| 久久精品国产77777蜜臀| 日本v片在线高清不卡在线观看| 日本在线观看不卡视频| 美女视频黄免费的久久 | 在线综合视频播放| 欧美一级久久久久久久大片| 欧美成人a∨高清免费观看| 欧美v日韩v国产v| 国产亚洲一二三区| 综合中文字幕亚洲| 亚洲无人区一区| 九色|91porny| 大桥未久av一区二区三区中文| 91色乱码一区二区三区| 91黄色小视频| 日韩美女一区二区三区| 久久午夜免费电影| 日韩一区日韩二区| 亚洲成av人综合在线观看| 久久av中文字幕片| 成人精品gif动图一区| 欧美色综合网站| 精品91自产拍在线观看一区| 亚洲欧洲日韩女同| 午夜一区二区三区视频| 久久爱另类一区二区小说| 成人免费视频一区| 欧美三级日韩三级| 久久网站最新地址| 一区二区三区在线观看国产| 美女在线观看视频一区二区| 成人av在线电影| 91精品国产色综合久久不卡电影| 中文久久乱码一区二区| 午夜精品久久久| 成人免费高清在线| 欧美一级欧美一级在线播放| 中文字幕第一区| 美女高潮久久久| 色香蕉成人二区免费| 精品奇米国产一区二区三区| 日韩一区中文字幕| 精品中文字幕一区二区| 日本道免费精品一区二区三区| 精品国产百合女同互慰| 亚洲一区二区四区蜜桃| 国产精品69毛片高清亚洲| 91.麻豆视频| 亚洲久草在线视频| 国产精品99久久久久久宅男| 欧美精品日韩综合在线| 中文字幕在线一区二区三区| 激情都市一区二区| 欧美乱妇一区二区三区不卡视频| 国产精品网站一区| 精品一区二区精品| 欧美精品丝袜久久久中文字幕| 亚洲欧美区自拍先锋| 国产麻豆日韩欧美久久| 日韩视频一区二区三区在线播放| 亚洲一线二线三线久久久| 成人精品视频一区二区三区| 亚洲精品一区在线观看| 青青草原综合久久大伊人精品 | 老司机午夜精品99久久| 91黄色小视频| 亚洲欧美日韩国产一区二区三区| 高清在线观看日韩| 久久久久久久久岛国免费| 美国毛片一区二区| 欧美一区二区三区免费| 亚洲一区二区成人在线观看| 色偷偷成人一区二区三区91| 日本一区二区视频在线观看| 久久99精品久久久| 欧美电影免费提供在线观看| 日韩成人一级大片| 欧美一区二区三区日韩视频| 日本成人中文字幕在线视频| 7777精品伊人久久久大香线蕉的| 亚洲国产成人高清精品| 欧美伊人久久大香线蕉综合69 | 亚洲欧美经典视频| heyzo一本久久综合| 国产精品国产三级国产专播品爱网 | 亚洲成年人影院| 欧美久久一二区| 午夜电影网一区| 日韩三级伦理片妻子的秘密按摩| 日韩黄色一级片| 欧美电影免费观看完整版| 久久er精品视频| 国产日韩欧美精品综合| 成人精品免费视频| 亚洲色图20p| 欧美日韩高清一区二区三区| 日韩精品一级二级 | 成人av动漫在线| 中文字幕一区在线观看| 91浏览器入口在线观看| 亚洲午夜久久久| 欧美一级片在线看| 国产一区二区主播在线| 国产欧美一区二区三区在线看蜜臀| 国产91色综合久久免费分享| 亚洲免费成人av| 欧美老人xxxx18| 久久国产剧场电影| 17c精品麻豆一区二区免费| 日本精品一区二区三区四区的功能| 午夜精品影院在线观看| 日韩一区二区免费在线电影| 国产不卡一区视频| 伊人性伊人情综合网| 精品三级在线看| 99久久免费精品| 蜜臀精品一区二区三区在线观看 | 国产精品自拍网站| 亚洲欧美日韩国产另类专区|