mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
Improved memory management
The heap now sets it's size at run time instead of being hard coded svn path=/trunk/; revision=2656
This commit is contained in:
parent
463cc8858c
commit
b764471786
10 changed files with 173 additions and 56 deletions
|
@ -33,8 +33,8 @@ LIB_FILES2 = comm/comm.a disk/disk.a mm/mm.a cache/cache.a
|
||||||
|
|
||||||
all: freeldr.sys
|
all: freeldr.sys
|
||||||
|
|
||||||
freeldr.sys: c_code.a
|
freeldr.sys: c_code.a end.o
|
||||||
$(LD) -N -Ttext=0x8000 --oformat=binary -s -o f.sys c_code.a
|
$(LD) -N -Ttext=0x8000 --oformat=binary -s -o f.sys c_code.a end.o
|
||||||
../bootsect/stubit ../bootsect/fatstub.bin f.sys freeldr.sys
|
../bootsect/stubit ../bootsect/fatstub.bin f.sys freeldr.sys
|
||||||
|
|
||||||
freeldr.exe: asmcode.a c_code.a
|
freeldr.exe: asmcode.a c_code.a
|
||||||
|
@ -73,6 +73,9 @@ parseini.o: parseini.c parseini.h
|
||||||
oslist.o: oslist.c oslist.h
|
oslist.o: oslist.c oslist.h
|
||||||
$(CC) $(FLAGS) -o oslist.o -c oslist.c
|
$(CC) $(FLAGS) -o oslist.o -c oslist.c
|
||||||
|
|
||||||
|
end.o: end.S
|
||||||
|
$(CC) $(FLAGS) -o end.o -c end.S
|
||||||
|
|
||||||
arch:
|
arch:
|
||||||
$(MAKE) -C arch
|
$(MAKE) -C arch
|
||||||
|
|
||||||
|
|
|
@ -57,4 +57,6 @@
|
||||||
void enable_a20(void);
|
void enable_a20(void);
|
||||||
void stop_floppy(void);
|
void stop_floppy(void);
|
||||||
|
|
||||||
|
extern unsigned long FreeLoaderModuleEnd;
|
||||||
|
|
||||||
#endif /* ! ASM */
|
#endif /* ! ASM */
|
||||||
|
|
|
@ -106,7 +106,7 @@ EXTERN(_GetExtendedMemorySize)
|
||||||
EXTERN(_GetConventionalMemorySize)
|
EXTERN(_GetConventionalMemorySize)
|
||||||
|
|
||||||
//
|
//
|
||||||
// get conventional memory size in KB
|
// Get conventional memory size in KB
|
||||||
//
|
//
|
||||||
pushl %edx
|
pushl %edx
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ EXTERN(_GetConventionalMemorySize)
|
||||||
andl $0xffff,%eax*/ // clear carry
|
andl $0xffff,%eax*/ // clear carry
|
||||||
|
|
||||||
/* Save return value */
|
/* Save return value */
|
||||||
movl %eax,%edx
|
movzwl %ax,%edx
|
||||||
|
|
||||||
call switch_to_prot
|
call switch_to_prot
|
||||||
|
|
||||||
|
|
27
freeldr/freeldr/end.S
Normal file
27
freeldr/freeldr/end.S
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* FreeLoader
|
||||||
|
* Copyright (C) 1998-2002 Brian Palmer <brianp@sginet.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
#define ASM
|
||||||
|
#include "arch.h"
|
||||||
|
|
||||||
|
|
||||||
|
EXTERN(_FreeLoaderModuleEnd)
|
||||||
|
.long _FreeLoaderModuleEnd
|
|
@ -40,7 +40,6 @@ LONG GetTimeOut(VOID);
|
||||||
|
|
||||||
VOID BootMain(VOID)
|
VOID BootMain(VOID)
|
||||||
{
|
{
|
||||||
ULONG Idx;
|
|
||||||
UCHAR SettingName[80];
|
UCHAR SettingName[80];
|
||||||
UCHAR SettingValue[80];
|
UCHAR SettingValue[80];
|
||||||
ULONG SectionId;
|
ULONG SectionId;
|
||||||
|
@ -57,7 +56,7 @@ VOID BootMain(VOID)
|
||||||
DebugInit();
|
DebugInit();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
InitMemoryManager( (PVOID) 0x20000 /* BaseAddress */, 0x58000 /* Length */);
|
InitMemoryManager();
|
||||||
|
|
||||||
if (!ParseIniFile())
|
if (!ParseIniFile())
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include <multiboot.h>
|
#include <multiboot.h>
|
||||||
|
|
||||||
|
|
||||||
VOID InitMemoryManager(PVOID BaseAddress, ULONG Length);
|
VOID InitMemoryManager(VOID);
|
||||||
|
|
||||||
PVOID AllocateMemory(ULONG NumberOfBytes);
|
PVOID AllocateMemory(ULONG NumberOfBytes);
|
||||||
VOID FreeMemory(PVOID MemBlock);
|
VOID FreeMemory(PVOID MemBlock);
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
include ../rules.mk
|
include ../rules.mk
|
||||||
|
|
||||||
OBJS = mm.o
|
OBJS = mm.o init.o
|
||||||
|
|
||||||
.PHONY : clean
|
.PHONY : clean
|
||||||
|
|
||||||
|
@ -28,9 +28,12 @@ all: mm.a
|
||||||
mm.a: $(OBJS)
|
mm.a: $(OBJS)
|
||||||
$(LD) -r -o mm.a $(OBJS)
|
$(LD) -r -o mm.a $(OBJS)
|
||||||
|
|
||||||
mm.o: mm.c ../mm.h
|
mm.o: mm.c ../mm.h mem.h
|
||||||
$(CC) $(FLAGS) -o mm.o -c mm.c
|
$(CC) $(FLAGS) -o mm.o -c mm.c
|
||||||
|
|
||||||
|
init.o: init.c ../mm.h mem.h
|
||||||
|
$(CC) $(FLAGS) -o init.o -c init.c
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
- $(RM) *.o
|
- $(RM) *.o
|
||||||
- $(RM) *.a
|
- $(RM) *.a
|
||||||
|
|
81
freeldr/freeldr/mm/init.c
Normal file
81
freeldr/freeldr/mm/init.c
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* FreeLoader
|
||||||
|
* Copyright (C) 1998-2002 Brian Palmer <brianp@sginet.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <freeldr.h>
|
||||||
|
#include <arch.h>
|
||||||
|
#include <mm.h>
|
||||||
|
#include "mem.h"
|
||||||
|
#include <rtl.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <ui.h>
|
||||||
|
|
||||||
|
|
||||||
|
ULONG RealFreeLoaderModuleEnd = 0;
|
||||||
|
|
||||||
|
PVOID HeapBaseAddress = NULL;
|
||||||
|
ULONG HeapLengthInBytes = 0;
|
||||||
|
ULONG HeapMemBlockCount = 0;
|
||||||
|
PMEMBLOCK HeapMemBlockArray = NULL;
|
||||||
|
|
||||||
|
VOID InitMemoryManager(VOID)
|
||||||
|
{
|
||||||
|
ULONG MemBlocks;
|
||||||
|
ULONG BaseAddress;
|
||||||
|
ULONG Length;
|
||||||
|
|
||||||
|
// Round up to the next page of memory
|
||||||
|
RealFreeLoaderModuleEnd = ((FreeLoaderModuleEnd + 4095) / 4096) * 4096;
|
||||||
|
BaseAddress = RealFreeLoaderModuleEnd;
|
||||||
|
Length = (MAXLOWMEMADDR - RealFreeLoaderModuleEnd);
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Initializing Memory Manager.\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Conventional memory size: %d KB\n", GetConventionalMemorySize()));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Low memory map:\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "00000\t1000\tReserved\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "01000\t6000\t16-bit stack\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "07000\t1000\tUnused\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "08000\t%x\tFreeLoader program code\n", (RealFreeLoaderModuleEnd - 0x8000)));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "%x\t%x\tLow memory heap\n", BaseAddress, Length));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "78000\t8000\t32-bit stack\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "80000\t10000\tFile system read buffer\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "90000\t10000\tDisk read buffer\n"));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "A0000\t60000\tReserved\n"));
|
||||||
|
|
||||||
|
// Calculate how many memory blocks we have
|
||||||
|
MemBlocks = (Length / MEM_BLOCK_SIZE);
|
||||||
|
|
||||||
|
// Adjust the heap length so we can reserve
|
||||||
|
// enough storage space for the MEMBLOCK array
|
||||||
|
Length -= (MemBlocks * sizeof(MEMBLOCK));
|
||||||
|
|
||||||
|
// Initialize our tracking variables
|
||||||
|
HeapBaseAddress = BaseAddress;
|
||||||
|
HeapLengthInBytes = Length;
|
||||||
|
HeapMemBlockCount = (HeapLengthInBytes / MEM_BLOCK_SIZE);
|
||||||
|
HeapMemBlockArray = (PMEMBLOCK)(HeapBaseAddress + HeapLengthInBytes);
|
||||||
|
|
||||||
|
// Clear the memory
|
||||||
|
RtlZeroMemory(HeapBaseAddress, HeapLengthInBytes);
|
||||||
|
RtlZeroMemory(HeapMemBlockArray, (HeapMemBlockCount * sizeof(MEMBLOCK)));
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
DbgPrint((DPRINT_MEMORY, "Memory Manager initialized. BaseAddress = 0x%x Length = 0x%x. %d blocks in heap.\n", BaseAddress, Length, HeapMemBlockCount));
|
||||||
|
//MemAllocTest();
|
||||||
|
#endif
|
||||||
|
}
|
48
freeldr/freeldr/mm/mem.h
Normal file
48
freeldr/freeldr/mm/mem.h
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* FreeLoader
|
||||||
|
* Copyright (C) 1998-2002 Brian Palmer <brianp@sginet.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __MEM_H
|
||||||
|
#define __MEM_H
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define this to 1 if you want the entire contents
|
||||||
|
// of the memory allocation bitmap displayed
|
||||||
|
// when a chunk is allocated or freed
|
||||||
|
//
|
||||||
|
#define DUMP_MEM_MAP_ON_VERIFY 0
|
||||||
|
|
||||||
|
#define MEM_BLOCK_SIZE 256
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
BOOL MemBlockAllocated; // Is this block allocated or free
|
||||||
|
ULONG BlocksAllocated; // Block length, in multiples of MEM_BLOCK_SIZE
|
||||||
|
} MEMBLOCK, *PMEMBLOCK;
|
||||||
|
|
||||||
|
|
||||||
|
extern ULONG RealFreeLoaderModuleEnd;
|
||||||
|
|
||||||
|
extern PVOID HeapBaseAddress;
|
||||||
|
extern ULONG HeapLengthInBytes;
|
||||||
|
extern ULONG HeapMemBlockCount;
|
||||||
|
extern PMEMBLOCK HeapMemBlockArray;
|
||||||
|
|
||||||
|
#endif // defined __MEM_H
|
|
@ -19,31 +19,12 @@
|
||||||
|
|
||||||
#include <freeldr.h>
|
#include <freeldr.h>
|
||||||
#include <mm.h>
|
#include <mm.h>
|
||||||
|
#include "mem.h"
|
||||||
#include <rtl.h>
|
#include <rtl.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <ui.h>
|
#include <ui.h>
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Define this to 1 if you want the entire contents
|
|
||||||
// of the memory allocation bitmap displayed
|
|
||||||
// when a chunk is allocated or freed
|
|
||||||
//
|
|
||||||
#define DUMP_MEM_MAP_ON_VERIFY 0
|
|
||||||
|
|
||||||
#define MEM_BLOCK_SIZE 256
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
BOOL MemBlockAllocated; // Is this block allocated or free
|
|
||||||
ULONG BlocksAllocated; // Block length, in multiples of 256 bytes
|
|
||||||
} MEMBLOCK, *PMEMBLOCK;
|
|
||||||
|
|
||||||
PVOID HeapBaseAddress = NULL;
|
|
||||||
ULONG HeapLengthInBytes = 0;
|
|
||||||
ULONG HeapMemBlockCount = 0;
|
|
||||||
PMEMBLOCK HeapMemBlockArray = NULL;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
ULONG AllocationCount = 0;
|
ULONG AllocationCount = 0;
|
||||||
|
|
||||||
|
@ -54,33 +35,6 @@ VOID DecrementAllocationCount(VOID);
|
||||||
VOID MemAllocTest(VOID);
|
VOID MemAllocTest(VOID);
|
||||||
#endif // DEBUG
|
#endif // DEBUG
|
||||||
|
|
||||||
VOID InitMemoryManager(PVOID BaseAddress, ULONG Length)
|
|
||||||
{
|
|
||||||
ULONG MemBlocks;
|
|
||||||
|
|
||||||
// Calculate how many memory blocks we have
|
|
||||||
MemBlocks = (Length / MEM_BLOCK_SIZE);
|
|
||||||
|
|
||||||
// Adjust the heap length so we can reserve
|
|
||||||
// enough storage space for the MEMBLOCK array
|
|
||||||
Length -= (MemBlocks * sizeof(MEMBLOCK));
|
|
||||||
|
|
||||||
// Initialize our tracking variables
|
|
||||||
HeapBaseAddress = BaseAddress;
|
|
||||||
HeapLengthInBytes = Length;
|
|
||||||
HeapMemBlockCount = (HeapLengthInBytes / MEM_BLOCK_SIZE);
|
|
||||||
HeapMemBlockArray = (PMEMBLOCK)(HeapBaseAddress + HeapLengthInBytes);
|
|
||||||
|
|
||||||
// Clear the memory
|
|
||||||
RtlZeroMemory(HeapBaseAddress, HeapLengthInBytes);
|
|
||||||
RtlZeroMemory(HeapMemBlockArray, (HeapMemBlockCount * sizeof(MEMBLOCK)));
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
DbgPrint((DPRINT_MEMORY, "Memory Manager initialized. BaseAddress = 0x%x Length = 0x%x. %d blocks in heap.\n", BaseAddress, Length, HeapMemBlockCount));
|
|
||||||
//MemAllocTest();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
PVOID AllocateMemory(ULONG NumberOfBytes)
|
PVOID AllocateMemory(ULONG NumberOfBytes)
|
||||||
{
|
{
|
||||||
ULONG BlocksNeeded;
|
ULONG BlocksNeeded;
|
||||||
|
|
Loading…
Reference in a new issue