98 lines
2.6 KiB
C
98 lines
2.6 KiB
C
|
/*
|
||
|
* memory-add.h
|
||
|
*
|
||
|
* Created on: Aug 27, 2011
|
||
|
* Author: Tiberiu
|
||
|
*/
|
||
|
|
||
|
#ifndef MEMORY_ADD_H_
|
||
|
#define MEMORY_ADD_H_
|
||
|
|
||
|
#include <memory.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <debugio.h>
|
||
|
|
||
|
/***************************************************
|
||
|
* Paging *
|
||
|
***************************************************/
|
||
|
typedef uint32 Page;
|
||
|
|
||
|
enum PageFlags
|
||
|
{
|
||
|
PagePresent = 0x1,
|
||
|
PageWriteable = 0x2,
|
||
|
PageUser = 0x4,
|
||
|
PageWriteThough = 0x8,
|
||
|
PageNotCacheable = 0x10,
|
||
|
PageAccessed = 0x20,
|
||
|
PageDirty = 0x40,
|
||
|
PagePAT = 0x80,
|
||
|
PageCpuGlobal = 0x100,
|
||
|
PageLvl4Global = 0x200,
|
||
|
PageFrame = 0xFFFFF000
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
typedef struct {
|
||
|
Page Pages[1024];
|
||
|
} PageTable;
|
||
|
|
||
|
typedef struct {
|
||
|
PageTable* Tables[1024];
|
||
|
uint32 TablesPhysical[1024];
|
||
|
uint32 PhysicalAddr;
|
||
|
} PageDirectory;
|
||
|
|
||
|
extern PageDirectory* CurrentDirectory;
|
||
|
extern PageDirectory* KernelDirectory;
|
||
|
|
||
|
extern void PagingInitialize(uint32 SystemMemory);
|
||
|
extern void PagingSwitchPageDirectory (PageDirectory* dir);
|
||
|
extern Page* PagingGetPage(uint32 addr, uint8 make, PageDirectory* dir);
|
||
|
|
||
|
|
||
|
/***************************************************
|
||
|
* Physical memory manager *
|
||
|
***************************************************/
|
||
|
extern uint32 TotalFrames;
|
||
|
extern uint32 TotalMemory;
|
||
|
extern uint32 UsedFrames;
|
||
|
|
||
|
void MemPhInitialize(uint32 SystemMemoryKb);
|
||
|
extern void MemPhSetFrame (uint32 frame, uint8 value);
|
||
|
uint32 MemPhGetFrame (uint32 frame);
|
||
|
uint32 MemPhFindFreeFrame();
|
||
|
void MemPhAllocFrame(Page* page, uint8 isKernel, uint8 isWriteable);
|
||
|
void MemPhFreeFrame(Page* page);
|
||
|
void MemPhReserveFrames (uint32 address, uint32 length);
|
||
|
|
||
|
|
||
|
/***************************************************
|
||
|
* Memory heap *
|
||
|
***************************************************/
|
||
|
typedef struct
|
||
|
{
|
||
|
OrderedArray Index;
|
||
|
uint32 StartAddress, EndAddress, MaxAddress;
|
||
|
// bit 0: supervisor-only bit 1: read-only
|
||
|
uint8 Flags;
|
||
|
} MemHeap;
|
||
|
|
||
|
extern MemHeap* KernelHeap;
|
||
|
|
||
|
extern uint32 MemHeapFindSmallestHole (uint32 size, uint8 page_align, MemHeap* heap);
|
||
|
extern int32 MemHeapCompare (uint32 a, uint32 b);
|
||
|
extern MemHeap* MemHeapCreate(uint32 start, uint32 end, uint32 max, uint8 flags);
|
||
|
extern void MemHeapExpand(uint32 newsz, MemHeap* heap, PageDirectory* pd);
|
||
|
extern uint32 MemHeapContract(uint32 newsz, MemHeap* heap, PageDirectory* pd);
|
||
|
extern uint32 MemHeapAlloc (uint32 size, uint8 isPageAligned, MemHeap* heap, PageDirectory* pd);
|
||
|
extern void MemHeapFree (uint32 address, MemHeap* heap, PageDirectory* pd);
|
||
|
|
||
|
|
||
|
#define LogMem(...) { Log("%#[Mem] ", ColorLightCyan); Log(__VA_ARGS__); }
|
||
|
#define ErrorMem(...) { Error("%#[Mem] ", ColorLightCyan); Error(__VA_ARGS__); }
|
||
|
|
||
|
|
||
|
#endif /* MEMORY_ADD_H_ */
|