summaryrefslogtreecommitdiff
path: root/kernel/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/mem.c')
-rw-r--r--kernel/mem.c92
1 files changed, 50 insertions, 42 deletions
diff --git a/kernel/mem.c b/kernel/mem.c
index 4e7d392..72b92af 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -3,6 +3,7 @@
#include <stdint.h>
#include "config.h"
+#include "multiboot.h"
#include "lib/logger/log.h" // logger facilities
//! 8 blocks per byte
@@ -14,6 +15,11 @@
//! block alignment ??? TODO: what is this!?
#define PMMNGR_BLOCK_ALIGN PMMNGR_BLOCK_SIZE
+extern uint32_t kernel_start[];
+extern uint32_t kernel_end[];
+extern uint32_t stack_top[];
+extern uint32_t stack_bottom[];
+
//memory map bit array. Each bit represents a 4KB memory block
static uint32_t *_mmngr_memory_map;
@@ -96,8 +102,9 @@ int mmap_first_free_s (uint32_t x)
void pmmngr_init_region (uint32_t base, uint32_t size)
{
- uint32_t align = base / PMMNGR_BLOCK_SIZE;
- uint32_t blocks = size / PMMNGR_BLOCK_SIZE;
+ if(base<0x100000)return;
+ uint32_t align = base / PMMNGR_BLOCK_SIZE +1; // TODO: calc properly
+ uint32_t blocks = size / PMMNGR_BLOCK_SIZE -1;
for (; blocks>0; blocks--)
{
@@ -108,8 +115,10 @@ void pmmngr_init_region (uint32_t base, uint32_t size)
void pmmngr_deinit_region (uint32_t base, uint32_t size)
{
- uint32_t align = base / PMMNGR_BLOCK_SIZE;
- uint32_t blocks = size / PMMNGR_BLOCK_SIZE;
+ uint32_t align = base / PMMNGR_BLOCK_SIZE -1; // TODO: calc properly
+ uint32_t blocks = size / PMMNGR_BLOCK_SIZE +2;
+
+ //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%08X, %08X -> deinit %d blocks",base,size,blocks);
for (; blocks>0; blocks--)
{
@@ -182,73 +191,72 @@ void pmmngr_free_block (void* p)
}
-void mem_init(uint16_t *memmap,uint16_t entries)
+void mem_init(uint32_t memmap,uint32_t length)
{
- // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"the memory map contains %d entries.",entries);
- // count available mem
- uint32_t total_mem=0, highest_end;
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"kernel loaded at: 0x%08X- 0x%08X",kernel_start,kernel_end);
- //save pointer to memmap
- uint16_t *save=memmap;
+ // we will place the memory map directly after the kernel for now (TODO: move somewehere else, so modules are not overwritten!)
+ _mmngr_memory_map=kernel_end;
- //print memory map and calc blocks.
- for(int i=0;i<entries;i++)
- {
- int mem=(memmap[4]+(memmap[5]<<16));
- uint32_t low_end=(((uint32_t)memmap[1])<<16)+memmap[0];
- uint32_t high_end=low_end+mem-1;
+ // count available mem and track high_end of usable memory
+ uint32_t total_mem=0, highest_end;
+ // iterate : print memory map and calc blocks.
+ for(uint32_t mmap_addr=memmap;mmap_addr<memmap+length;)
+ {
+ multiboot_mmap *mmap=mmap_addr;
+ uint64_t mem_start=mmap->base_addr;
+ uint64_t mem_end=mmap->base_addr+mmap->length;
#ifdef MEM_PRINT_MEMORYMAP
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"range: 0x%08x - 0x%08x (%s %d KB)",
- low_end,high_end,memmap_type_to_string[memmap[8]-1],mem/1024);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%08X - %08X / type: %s, (size: %d)",
+ (uint32_t)mem_start, (uint32_t)mem_end, memmap_type_to_string[mmap->type-1], mmap->size);
#endif
+ uint32_t mem=mmap->length;
+
//reclaimable OR usable
- if(memmap[8]==1||memmap[8]==3)
+ if(mmap->type==1||mmap->type==3)
{
total_mem+=mem;
- highest_end=high_end;
-
+ highest_end=mmap->base_addr+mmap->length-1;
}
- memmap+=12; // next entry;
+ //next
+ mmap_addr+=mmap->size+4;
}
- int blocks=highest_end/4096+1;
+ uint32_t blocks=highest_end/4096+1;
mem_array_size=blocks/32+1;
- _mmngr_memory_map=0x500000;
-
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Init bitmap for 0x%X blocks (size: %d bytes)",blocks,mem_array_size*4);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Init bitmap for %d blocks (array size: %d bytes)",blocks,mem_array_size*4);
pmmngr_init (); //clear memmap
- //restore pointer to memmap
- memmap=save;
-
- for(int i=0;i<entries;i++)
+ // iterate : initialize memory
+ for(uint32_t mmap_addr=memmap;mmap_addr<memmap+length;)
{
- if(memmap[8]==1||memmap[8]==3)
+ multiboot_mmap *mmap=mmap_addr;
+
+ //reclaimable OR usable
+ if(mmap->type==1||mmap->type==3)
{
- pmmngr_init_region(memmap[0]+(memmap[1]<<16),memmap[4]+((memmap[5])<<16));
+ pmmngr_init_region(mmap->base_addr,mmap->length);
}
- memmap+=12;
+
+ //next
+ mmap_addr+=mmap->size+4;
}
-
- // here is somewhere our kernel stuff.
- // reserve 4Mb (0x100000-0x500000) for kernel and ext2 img
- // even more!
- pmmngr_deinit_region(0x0,0x1400000);
+
- // and here is the memory map that we JUST created!
- pmmngr_deinit_region(0x500000,mem_array_size*4+PMMNGR_BLOCK_SIZE);
-
+ // deinitialize kernel + memory (TODO: modules)
+ pmmngr_deinit_region(kernel_start,((uint32_t)kernel_end-(uint32_t)kernel_start));
+ pmmngr_deinit_region(_mmngr_memory_map,mem_array_size*4+PMMNGR_BLOCK_SIZE);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Usable Mem: %d (0x%X) bytes. (~%d MB)",total_mem,total_mem,total_mem/1024/1024);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Currently Free 4K blocks: %d blocks.",mem_free_blocks);
-
+ // mmap_show_free();
}
// analytics