亚洲欧美第一页_禁久久精品乱码_粉嫩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):
//***********************************************************************/
//    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);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产区一| 一区av在线播放| 五月激情综合网| 高清国产午夜精品久久久久久| 在线亚洲免费视频| 欧美精品一区二区三区蜜桃视频 | 91在线视频播放地址| 欧美一区二区三区小说| 亚洲日本韩国一区| 国产激情一区二区三区| 欧美色精品在线视频| 一区在线中文字幕| 国产永久精品大片wwwapp| 欧美日韩国产经典色站一区二区三区| 亚洲国产岛国毛片在线| 免费观看日韩av| 欧美精品日韩一区| 亚洲视频在线一区| 成人午夜免费视频| 国产色产综合色产在线视频| 另类欧美日韩国产在线| 欧美日韩mp4| 一区二区日韩av| 色婷婷av一区二区三区软件| 中文字幕第一区| 国产一区二区三区免费看| 欧美一区二区三区视频| 日日摸夜夜添夜夜添亚洲女人| 91豆麻精品91久久久久久| 国产精品沙发午睡系列990531| 国产成人av一区二区三区在线| 精品福利二区三区| 美女在线视频一区| 日韩视频一区二区| 麻豆91免费看| 欧美xxxxx牲另类人与| 久久国产尿小便嘘嘘尿| 日韩美女在线视频 | 亚洲猫色日本管| 91一区一区三区| 亚洲嫩草精品久久| 欧美在线观看18| 亚洲国产cao| 91精品国产91久久综合桃花| 日本在线不卡视频| 精品国产亚洲在线| 高清在线观看日韩| 日韩理论片在线| 欧美亚洲另类激情小说| 天天亚洲美女在线视频| 精品国产乱码久久久久久久久| 久久爱另类一区二区小说| 国产视频视频一区| www.综合网.com| 亚洲主播在线播放| 欧美一区二区久久| 国产原创一区二区三区| 国产精品美女一区二区在线观看| 91麻豆国产香蕉久久精品| 午夜日韩在线电影| 欧美成人精品二区三区99精品| 国产伦精品一区二区三区视频青涩| 亚洲国产经典视频| 欧美日韩亚洲综合一区| 精品一区二区三区视频在线观看 | 亚洲午夜电影在线| 91精品国产福利| 成人免费毛片高清视频| 亚洲综合激情另类小说区| 欧美tk丨vk视频| 91网上在线视频| 精品伊人久久久久7777人| 亚洲欧洲精品成人久久奇米网| 欧美日韩一区二区在线观看视频 | 久久超碰97中文字幕| 中文字幕亚洲综合久久菠萝蜜| 欧美高清激情brazzers| 懂色中文一区二区在线播放| 无码av免费一区二区三区试看| 欧美激情综合五月色丁香| 欧美三级日韩三级国产三级| 国产+成+人+亚洲欧洲自线| 视频一区二区中文字幕| 中文字幕中文字幕一区| 日韩视频一区二区在线观看| 99精品视频在线观看免费| 老司机精品视频线观看86| 亚洲永久精品大片| 中文字幕欧美日韩一区| 欧美一区二区视频观看视频| 色综合久久中文字幕| 国产福利不卡视频| 亚洲国产精品嫩草影院| 自拍偷拍亚洲欧美日韩| 久久午夜免费电影| 91精品国产综合久久香蕉麻豆 | 国内精品国产三级国产a久久| 亚洲高清视频的网址| 国产精品乱码人人做人人爱| 亚洲精品一线二线三线无人区| 欧美日韩午夜在线| 91毛片在线观看| 成人免费看视频| 国产精品69久久久久水密桃| 久草中文综合在线| 人人精品人人爱| 日韩一区精品字幕| 天天av天天翘天天综合网 | 国产欧美精品一区二区三区四区| 欧美一区二区在线观看| 欧美久久一二区| 欧美一区二区播放| 欧美一级久久久| 日韩一级二级三级精品视频| 欧美精品一二三区| 欧美军同video69gay| 欧美日韩在线直播| 精品视频在线免费看| 欧美视频一区二区三区在线观看| 色偷偷久久一区二区三区| 91在线精品一区二区| 91年精品国产| 色综合视频一区二区三区高清| 91在线视频18| 欧美在线|欧美| 欧美肥妇free| 欧美一区二区在线观看| 精品国产91洋老外米糕| 国产午夜精品一区二区三区嫩草| 中文欧美字幕免费| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲sss视频在线视频| 亚洲成人1区2区| 蜜桃免费网站一区二区三区| 国产一区91精品张津瑜| 国产69精品久久777的优势| 91一区二区在线观看| 欧美狂野另类xxxxoooo| 久久久91精品国产一区二区三区| 国产精品女同一区二区三区| 亚洲国产视频在线| 久久精品国产久精国产爱| 丁香桃色午夜亚洲一区二区三区| 99久久99久久精品国产片果冻| 91国模大尺度私拍在线视频| 欧美一区国产二区| 中文字幕在线观看不卡视频| 亚洲国产日韩在线一区模特| 国产专区欧美精品| 91亚洲资源网| 日韩欧美亚洲国产另类| 国产精品天干天干在观线| 午夜私人影院久久久久| 成人午夜视频在线观看| 91麻豆精品久久久久蜜臀| 中文字幕精品一区二区精品绿巨人 | 日韩综合一区二区| 国产精品69久久久久水密桃| 欧美性色综合网| 国产午夜久久久久| 日本一区中文字幕| 91色.com| 亚洲国产精品v| 久久9热精品视频| 欧美性生活影院| 国产精品传媒入口麻豆| 久久精品国产精品亚洲精品| 色综合天天综合网天天看片| 久久日一线二线三线suv| 午夜一区二区三区视频| 成人h版在线观看| 精品国产免费久久| 五月天一区二区三区| 日本高清不卡在线观看| 久久久91精品国产一区二区精品 | 欧美精品三级在线观看| 亚洲色图色小说| 国产乱妇无码大片在线观看| 91麻豆精品91久久久久同性| 亚洲一区二区不卡免费| 99精品一区二区| 国产农村妇女毛片精品久久麻豆 | 久久亚洲一区二区三区四区| 午夜精品久久一牛影视| 91同城在线观看| 中文字幕中文字幕一区二区| 国内久久精品视频| 精品美女在线播放| 久久国产精品第一页| 欧美一区二区三区啪啪| 手机精品视频在线观看| 色婷婷久久综合| 亚洲美女电影在线| 91污片在线观看| 玉米视频成人免费看| 91福利视频在线| 亚洲一本大道在线| 欧美唯美清纯偷拍| 一级特黄大欧美久久久| 欧美日韩不卡一区二区|