Improved memory management
authorBrian Palmer <brianp@sginet.com>
Wed, 27 Feb 2002 21:33:59 +0000 (21:33 +0000)
committerBrian Palmer <brianp@sginet.com>
Wed, 27 Feb 2002 21:33:59 +0000 (21:33 +0000)
The heap now sets it's size at run time instead of being hard coded

svn path=/trunk/; revision=2656

freeldr/freeldr/Makefile
freeldr/freeldr/arch.h
freeldr/freeldr/arch/i386/mem.S
freeldr/freeldr/end.S [new file with mode: 0644]
freeldr/freeldr/freeldr.c
freeldr/freeldr/mm.h
freeldr/freeldr/mm/Makefile
freeldr/freeldr/mm/init.c [new file with mode: 0644]
freeldr/freeldr/mm/mem.h [new file with mode: 0644]
freeldr/freeldr/mm/mm.c

index 2b09514..7b2e412 100644 (file)
@@ -33,8 +33,8 @@ LIB_FILES2 = comm/comm.a disk/disk.a mm/mm.a cache/cache.a
 
 all:   freeldr.sys
 
-freeldr.sys:   c_code.a
-       $(LD) -N -Ttext=0x8000 --oformat=binary -s -o f.sys c_code.a
+freeldr.sys:   c_code.a end.o
+       $(LD) -N -Ttext=0x8000 --oformat=binary -s -o f.sys c_code.a end.o
        ../bootsect/stubit ../bootsect/fatstub.bin f.sys freeldr.sys 
 
 freeldr.exe:   asmcode.a c_code.a
@@ -73,6 +73,9 @@ parseini.o:   parseini.c parseini.h
 oslist.o:      oslist.c oslist.h
        $(CC) $(FLAGS) -o oslist.o -c oslist.c
 
+end.o: end.S
+       $(CC) $(FLAGS) -o end.o -c end.S
+
 arch:
        $(MAKE) -C arch
 
index a420c15..176b487 100644 (file)
@@ -57,4 +57,6 @@
 void   enable_a20(void);
 void   stop_floppy(void);
 
+extern unsigned long FreeLoaderModuleEnd;
+
 #endif /* ! ASM */
index 326ba04..0744dd3 100644 (file)
@@ -106,7 +106,7 @@ EXTERN(_GetExtendedMemorySize)
 EXTERN(_GetConventionalMemorySize)
 
        //
-       // get conventional memory size in KB
+       // Get conventional memory size in KB
        //
        pushl   %edx
 
@@ -123,7 +123,7 @@ EXTERN(_GetConventionalMemorySize)
        andl    $0xffff,%eax*/  // clear carry
 
        /* Save return value */
-       movl    %eax,%edx
+       movzwl  %ax,%edx
 
        call    switch_to_prot
 
diff --git a/freeldr/freeldr/end.S b/freeldr/freeldr/end.S
new file mode 100644 (file)
index 0000000..531940d
--- /dev/null
@@ -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
index eb1598e..7ed45be 100644 (file)
@@ -40,7 +40,6 @@ LONG  GetTimeOut(VOID);
 
 VOID BootMain(VOID)
 {
-       ULONG   Idx;
        UCHAR   SettingName[80];
        UCHAR   SettingValue[80];
        ULONG   SectionId;
@@ -57,7 +56,7 @@ VOID BootMain(VOID)
        DebugInit();
 #endif
 
-       InitMemoryManager( (PVOID) 0x20000 /* BaseAddress */, 0x58000 /* Length */);
+       InitMemoryManager();
 
        if (!ParseIniFile())
        {
index 1252ed7..8b1a30e 100644 (file)
@@ -24,7 +24,7 @@
 #include <multiboot.h>
 
 
-VOID   InitMemoryManager(PVOID BaseAddress, ULONG Length);
+VOID   InitMemoryManager(VOID);
 
 PVOID  AllocateMemory(ULONG NumberOfBytes);
 VOID   FreeMemory(PVOID MemBlock);
index 2da1fb0..1e05a75 100644 (file)
@@ -19,7 +19,7 @@
        
 include ../rules.mk
 
-OBJS = mm.o
+OBJS = mm.o init.o
 
 .PHONY : clean
 
@@ -28,9 +28,12 @@ all: mm.a
 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
 
+init.o:        init.c ../mm.h mem.h
+       $(CC) $(FLAGS) -o init.o -c init.c
+
 clean:
        - $(RM) *.o
        - $(RM) *.a
diff --git a/freeldr/freeldr/mm/init.c b/freeldr/freeldr/mm/init.c
new file mode 100644 (file)
index 0000000..17cda07
--- /dev/null
@@ -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
+}
diff --git a/freeldr/freeldr/mm/mem.h b/freeldr/freeldr/mm/mem.h
new file mode 100644 (file)
index 0000000..097fa09
--- /dev/null
@@ -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
index 67cff79..9b300ae 100644 (file)
 
 #include <freeldr.h>
 #include <mm.h>
+#include "mem.h"
 #include <rtl.h>
 #include <debug.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
 ULONG          AllocationCount = 0;
 
@@ -54,33 +35,6 @@ VOID         DecrementAllocationCount(VOID);
 VOID           MemAllocTest(VOID);
 #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)
 {
        ULONG   BlocksNeeded;