diff options
Diffstat (limited to 'kernel/mem.c')
| -rw-r--r-- | kernel/mem.c | 92 |
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 |
