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

📄 alloc.cpp

📁 XOSL 多操作系统管理工具 源代码 多系统引导工具
💻 CPP
字号:
/*
 * Extended Operating System Loader (XOSL)
 * Copyright (c) 1999 by Geurt Vos
 *
 * This code is distributed under GNU General Public License (GPL)
 *
 * The full text of the license can be found in the GPL.TXT file,
 * or at http://www.gnu.org
 */

/*
 * Basic 'First Fit' allocation unit
 */

#include <alloc.h>
#include <mem.h>

typedef struct SMemDesc {
	struct SMemDesc *Next;
	struct SMemDesc *Prev;
	long PageCount;
	char Reserved[4];
} TMemDesc, *PMemDesc;

static PMemDesc FreeList;

_extern void AllocInit(unsigned long MemStart)
{
	PMemDesc NextItem;

	FreeList = (PMemDesc)MemStart;
	NextItem = (PMemDesc)(0x00010000 + (long)MemStart);
	FreeList->Prev = NULL;
	FreeList->Next = NextItem;
	FreeList->PageCount = 0;
	NextItem->Prev = FreeList;
	NextItem->Next = NULL;
	NextItem->PageCount = (0x000a0000 - PhysAddr(MemStart) >> 4) - 1;
}

void *operator new (unsigned int Size)
{
	long PageCount;
	PMemDesc MemDesc, OldDesc;

	PageCount = 1 + (Size >> 4);
	if (Size & 0x0f)
		++PageCount;

	for (MemDesc = FreeList->Next; MemDesc->PageCount < PageCount; MemDesc = MemDesc->Next);

	OldDesc = MemDesc;
	if (MemDesc->PageCount == PageCount) {
		// remove entire free memory block
		MemDesc->Prev->Next = MemDesc->Next;
		if (MemDesc->Next)
			MemDesc->Next->Prev = MemDesc->Prev;
	}
	else {
		// shrink free memory block
		MemDesc = (PMemDesc)((PageCount << 16) + (long)MemDesc);
		MemDesc->Next = OldDesc->Next;
		MemDesc->Prev = OldDesc->Prev;
		OldDesc->Prev->Next = MemDesc;
		OldDesc->Next->Prev = MemDesc;
		MemDesc->PageCount = OldDesc->PageCount - PageCount;
		OldDesc->PageCount = PageCount;
	}
	return (void *)(0x00010000 + (long)OldDesc);
}

void operator delete (void *ptr)
{
	PMemDesc Prev, Next, New;
	long MergeNext;

	if (!ptr)
		return;
	for (Next = FreeList->Next; (long)Next < (long)ptr; Next = Next->Next);

	Prev = Next->Prev;
	New = (PMemDesc)( ((long)ptr) - 0x00010000 );

	MergeNext = (Prev->PageCount << 16) + (long)Prev;
	if (MergeNext == (long)New) {
		Prev->PageCount += New->PageCount;
		New = Prev;
	}
	else {
		Prev->Next = New;
		New->Prev = Prev;
	}
	MergeNext = (New->PageCount << 16) + (long)New;
	if (MergeNext == (long)Next) {
		New->PageCount += Next->PageCount;
		New->Next = Next->Next;
		if (Next->Next)
			Next->Next->Prev = New;
	}
	else {
		New->Next = Next;
		Next->Prev = New;
	}
}

long CoreLeft()
{
	PMemDesc Entry;
	long Core = 0;

	for (Entry = FreeList->Next; Entry; Entry = Entry->Next)
		Core += Entry->PageCount;
	return Core << 4;
}

⌨️ 快捷键说明

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