summaryrefslogtreecommitdiff
path: root/kernel/mem.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-08-07 22:02:20 +0200
committerMichal Idziorek <m.i@gmx.at>2014-08-07 22:02:20 +0200
commit7ac2301d899be25b5e51d138fdb227ed0dbdca2d (patch)
treec39d1cc1878f6b9f5f891c4b607a0a31ab5c386e /kernel/mem.c
parent6306a1e34a712cdd9fd968643a1796634fa24cec (diff)
physical memory allocation and fixed some bugs
Diffstat (limited to 'kernel/mem.c')
-rw-r--r--kernel/mem.c112
1 files changed, 98 insertions, 14 deletions
diff --git a/kernel/mem.c b/kernel/mem.c
index 1bb4109..e1253b1 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -9,12 +9,16 @@
//! block alignment
#define PMMNGR_BLOCK_ALIGN PMMNGR_BLOCK_SIZE
+#define MEM_BITMAP_SIZE 32768
+//#define MEM_BITMAP_SIZE 327
+
// memory map bit array. Each bit represents a memory block
-static uint32_t _mmngr_memory_map[129*1024];
+//uint32_t _mmngr_memory_map[MEM_BITMAP_SIZE];
+uint32_t *_mmngr_memory_map;
+
static uint32_t mem_free_blocks;
// bit funcs!
-
void mmap_set(int bit)
{
_mmngr_memory_map[bit / 32] |= (1 << (bit % 32));
@@ -30,18 +34,19 @@ int mmap_test(int bit)
return _mmngr_memory_map[bit / 32] & (1 << (bit % 32));
}
-///
-
-int mmap_first_free () {
+//
+int mmap_first_free ()
+{
//! find the first free bit
uint32_t i;
int j;
-
- for (i=0; i< 128 ; i++)
+ for (i=0; i< MEM_BITMAP_SIZE ; i++)
if (_mmngr_memory_map[i] != 0xffffffff)
- for (j=0; j<32; j++) { //! test each bit in the dword
+ for (j=0; j<32; j++)
+ {
+ //! test each bit in the dword
int bit = 1 << j;
if (! (_mmngr_memory_map[i] & bit) )
@@ -49,17 +54,21 @@ int mmap_first_free () {
}
return -1;
+
}
-void pmmngr_init () {
-
+void pmmngr_init ()
+{
//! By default, all of memory is in use
// memset (_mmngr_memory_map, 0xf, 128 );
int i;
- for(i=0;i++;i<128*1024)
+
+ for(i=0;i<MEM_BITMAP_SIZE;i++)
{
_mmngr_memory_map[i]=0xffffffff;
}
+
+
}
void pmmngr_init_region (uint32_t base, uint32_t size)
@@ -87,6 +96,79 @@ void pmmngr_init_region (uint32_t base, uint32_t size)
//mmap_set (0); //first block is always set. This insures allocs cant be 0
}
+void* pmmngr_alloc_block ()
+{
+
+ int frame = mmap_first_free ();
+
+ if (frame == -1)
+ {
+ scr_put_string_nl("OUT OF MEM!");
+ return 0; //out of memory
+ }
+
+// scr_put_string_nl("MEM ALLOC OK!");
+// scr_put_hex32(frame);
+ // scr_put_string_nl("");
+
+ mmap_set (frame);
+
+ uint32_t addr = frame * PMMNGR_BLOCK_SIZE;
+ mem_free_blocks--;
+
+ return (void*)addr;
+}
+
+void pmmngr_free_block (void* p) {
+
+ uint32_t addr = (uint32_t*)p;
+ int frame = addr / PMMNGR_BLOCK_SIZE;
+
+ if(mmap_test(frame))
+ {
+ mmap_unset (frame);
+ mem_free_blocks++;
+ }
+
+}
+
+void mem_test_2()
+{
+ //crossing 512MB boundary!
+ // (do not do this in real, coz it probably is reserved)
+ //mem_test(0x1fee1000,0x2000f000,0x800);
+
+ int cnt=-1;
+ uint32_t *addr;
+ uint32_t *lastaddr;
+
+ do{
+ lastaddr=addr;
+ addr=pmmngr_alloc_block();
+ cnt++;
+ }while(addr!=0);
+
+
+ scr_put_string("no mem after : ");
+ scr_put_hex32(cnt);
+ scr_put_string_nl("");
+
+ pmmngr_free_block(lastaddr);
+
+
+ cnt=-1;
+ do{
+ lastaddr=addr;
+ addr=pmmngr_alloc_block();
+ cnt++;
+ }while(addr!=0);
+
+
+ scr_put_string("no mem after : ");
+ scr_put_hex32(cnt);
+ scr_put_string_nl("");
+}
+
void mem_test(int start, int end, int steps)
{
int *p=start;
@@ -107,7 +189,10 @@ void mem_test(int start, int end, int steps)
void mem_init(uint16_t *memmap)
{
+
+ _mmngr_memory_map=0x9000;
mem_free_blocks=0;
+ pmmngr_init ();
// count available memory
uint32_t avail_mem=0;
@@ -153,9 +238,8 @@ void mem_init(uint16_t *memmap)
scr_put_hex(mem_free_blocks&0xffff);
scr_put_string_nl("");
- //crossing 512MB boundary!
- // (do not do this in real, coz it probably is reserved)
- //mem_test(0x1fee1000,0x2000f000,0x800);
+
+
}