From 06e382afcbf199e5e4ec92574a3872ab04fb6e9e Mon Sep 17 00:00:00 2001 From: Michal Idziorek Date: Thu, 4 Sep 2014 15:16:13 +0200 Subject: Improved physical memory manager and cleaning up. --- kernel/mem.c | 269 ++++++++++++++++++++++++----------------------------------- 1 file changed, 107 insertions(+), 162 deletions(-) (limited to 'kernel/mem.c') diff --git a/kernel/mem.c b/kernel/mem.c index 9899822..0b9dab7 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -1,9 +1,9 @@ +#define FOOLOS_MODULE_NAME "mem" #define MEM_PRINT_MEMORYMAP #include "lib/int/stdint.h" #include "lib/logger/log.h" // logger facilities -#define FOOLOS_MODULE_NAME "mem" //! 8 blocks per byte #define PMMNGR_BLOCKS_PER_BYTE 8 @@ -14,14 +14,11 @@ //! 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 -//uint32_t _mmngr_memory_map[MEM_BITMAP_SIZE]; -uint32_t _mmngr_memory_map[MEM_BITMAP_SIZE]; +//memory map bit array. Each bit represents a 4KB memory block +static uint32_t *_mmngr_memory_map; static uint32_t mem_free_blocks; +static uint32_t mem_array_size; // bit funcs! void mmap_set(int bit) @@ -39,127 +36,79 @@ int mmap_test(int bit) return _mmngr_memory_map[bit / 32] & (1 << (bit % 32)); } -void mmap_show_free () +void pmmngr_init () { - - int last_pos=0; - uint32_t last=_mmngr_memory_map[0]; - - for (int i=1; i< MEM_BITMAP_SIZE ; i++) + // By default, all of memory is in use + for(int i=0;i0; blocks--) { - _mmngr_memory_map[i]=0xffffffff; + mmap_unset (align++); + mem_free_blocks++; } - - } -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; for (; blocks>0; blocks--) { - // hack to lock first ~4MB of memory - if(align<1000) - { - align++; - continue; - } - - - mmap_unset (align++); - mem_free_blocks++; - //_mmngr_used_blocks--; + mmap_set (align++); + mem_free_blocks--; } - //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) { log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"OUT OF MEMORY"); 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) { - +void pmmngr_free_block (void* p) +{ uint32_t addr = (uint32_t*)p; int frame = addr / PMMNGR_BLOCK_SIZE; @@ -168,125 +117,121 @@ void pmmngr_free_block (void* p) { mmap_unset (frame); mem_free_blocks++; } - } -/* -void mem_test_3() +void mem_init(uint16_t *memmap,uint16_t entries) { - uint32_t *addr; - addr=pmmngr_alloc_block(); - scr_put_string("alloc 1: "); - scr_put_hex32(addr); - scr_put_string_nl(""); + // init free blocks counter + mem_free_blocks=0; - addr=pmmngr_alloc_block(); - scr_put_string("alloc 2: "); - scr_put_hex32(addr); - scr_put_string_nl(""); -} + // count available mem + uint32_t total_mem=0, highest_end=0, high_end_low=0; -void mem_test_2() -{ - //crossing 512MB boundary! - // (do not do this in real, coz it probably is reserved) - //mem_test(0x1fee1000,0x2000f000,0x800); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"the memory map contains %d entries.",entries); - int cnt=-1; - uint32_t *addr; - uint32_t *lastaddr; + // preserve pointer + uint16_t save=memmap; - do{ - lastaddr=addr; - addr=pmmngr_alloc_block(); - cnt++; - }while(addr!=0); + //print memory map and calc blocks. + for(int i=0;ihighest_end){ + highest_end=high_end; + high_end_low=low_end; + } + } + memmap+=12; + + } + // restore pointer + memmap=save; - cnt=-1; - do{ - lastaddr=addr; - addr=pmmngr_alloc_block(); - cnt++; - }while(addr!=0); + int blocks=highest_end/4096+1; + mem_array_size=blocks/32+1; - 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; - for(;p