⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ksysmem.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
字号:
/******************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
******************************************************/

/*****************************************************
文件说明:内存分配管理,该功能以页为单位分配内存,实用于没有虚存的系统(有
          虚存的系统也可以调用该函数,这时,这些函数相当于VirtualAlloc & VirtualFree)
版本号:2.0.0
开发时期:2000
作者:李林
修改记录:
******************************************************/

#include <eframe.h>
#include <pagemgr.h>
#include <oemfunc.h>
#include <coresrv.h>

#include <cpu.h>
#include <epcore.h>

// ********************************************************************
//声明:LPVOID DoAllocPageMem( DWORD dwNeedSize, DWORD * lpdwRealSize, UINT uiFlag )
//参数:
// IN dwNeedSize - 需要的内存尺寸(以字节为单位)
// OUT lpdwRealSize - 用于接受真实的字节数
// IN uiFlag - 保留
//返回值:
// 假如成功,返回有效的对齐页边界的指针,lpdwRealSize保存真实的字节数;负责返回NULL
//功能描述:
// 已页为单位分配内存
//
// ********************************************************************
#define DEBUG_DOALLOCPAGEMEM 0
LPVOID DoAllocPageMem( DWORD dwNeedSize, DWORD * lpdwRealSize, UINT uiFlag )
{
	void * p = Page_GetContiguous( ALIGN_PAGE_UP( dwNeedSize ) / PAGE_SIZE, 0 );

	if( lpdwRealSize )
		*lpdwRealSize = 0;

	if( p )
	{
		if( lpdwRealSize )
		    *lpdwRealSize = ALIGN_PAGE_UP( dwNeedSize );
	}
	else
	{
		WARNMSG( DEBUG_DOALLOCPAGEMEM, ( "error: no enough memory.\r\n" ) );
		KL_SetLastError( ERROR_NOT_ENOUGH_MEMORY );
	}
	
	return p;
}

// ********************************************************************
//声明:LPVOID WINAPI KL_AllocPageMem( DWORD dwNeedSize, DWORD * lpdwRealSize, UINT uiFlag )
//参数:
// IN dwNeedSize - 需要的内存尺寸(以字节为单位)
// OUT lpdwRealSize - 用于接受真实的字节数
// IN uiFlag - 保留
//返回值:
// 假如成功,返回有效的对齐页边界的指针,lpdwRealSize保存真实的字节;负责返回NULL
//功能描述:
// 以页为单位分配内存
//引用:
//	系统API
// ********************************************************************

LPVOID WINAPI KL_AllocPageMem( DWORD dwNeedSize, DWORD * lpdwRealSize, UINT uiFlag )
{
#ifdef VIRTUAL_MEM
	void * p = 0;
	if( lpdwRealSize )
		*lpdwRealSize = 0;

	if( uiFlag & PM_SHARE )
		p = (LPVOID)SHARE_MEM_BASE;


    p =  KL_VirtualAlloc( p, dwNeedSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
	if( p && lpdwRealSize )
	{
		*lpdwRealSize = ALIGN_PAGE_UP( dwNeedSize );
	}
	return p;
#else
    return DoAllocPageMem( dwNeedSize, lpdwRealSize, uiFlag );
#endif
}

// ********************************************************************
//声明:BOOL DoFreePageMem( LPVOID lpvMemAdrStart, UINT uiLen  )
//参数:
// IN lpvMemAdrStart - 需要释放的内存
// IN uiLen - 释放长度
//返回值:
// 假如成功,返回TRUE; 负责返回FALSE
//功能描述:
// 释放之前用DoAllocPageMem 分配的内存
//引用:
//	
// ********************************************************************

BOOL DoFreePageMem( LPVOID lpvMemAdrStart, UINT uiLen  )
{
	extern BOOL Page_ReleaseContiguous( LPVOID lpAdr, DWORD dwPages );

    uiLen = ALIGN_PAGE_UP( uiLen ) / PAGE_SIZE; 
    return Page_ReleaseContiguous( lpvMemAdrStart, uiLen ); 
}

// ********************************************************************
//声明:BOOL WINAPI KL_FreePageMem( LPVOID lpvMemAdrStart, UINT uiLen  )
//参数:
// IN lpvMemAdrStart - 需要释放的内存
// IN uiLen - 释放长度
//返回值:
// 假如成功,返回TRUE; 负责返回FALSE
//功能描述:
// 释放之前用 KL_AllocPageMem 分配的内存,当为VIRTUAL_MEM版时,释放所有的
//引用:
//	系统API
// ********************************************************************

BOOL WINAPI KL_FreePageMem( LPVOID lpvMemAdrStart, UINT uiLen  )
{
#ifdef VIRTUAL_MEM
	return KL_VirtualFree( lpvMemAdrStart, 0, MEM_RELEASE );
#else
	return DoFreePageMem( lpvMemAdrStart, uiLen );
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -