From 44dcbdf16674bc727503ca748f95eec847755b2f Mon Sep 17 00:00:00 2001 From: Michal Idziorek Date: Thu, 4 Sep 2014 16:19:52 +0200 Subject: cleanup and improvements in physical mem manager. --- kernel/mem.c | 57 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 12 deletions(-) (limited to 'kernel/mem.c') diff --git a/kernel/mem.c b/kernel/mem.c index 0b9dab7..ffa56c4 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -45,25 +45,36 @@ void pmmngr_init () } } +//find the first free bit int mmap_first_free () { - //! find the first free bit - uint32_t i; - int j; - - for (i=0; i< mem_array_size ; i++) + for (int i=0; i< mem_array_size ; i++) if (_mmngr_memory_map[i] != 0xffffffff) - for (j=0; j<32; j++) + for (int j=0; j<32; j++) { - //! test each bit in the dword - int bit = 1 << j; - if (! (_mmngr_memory_map[i] & bit) ) - return i*4*8+j; + if(!mmap_test(32*i+j))return 32*i+j; } return -1; } +//find the first free consecutive x bits +int mmap_first_free_s (uint32_t x) +{ + int found=0; + + for (int i=0; i< mem_array_size; i++) + if (_mmngr_memory_map[i] != 0xffffffff) + for (int j=0; j<32; j++) + { + if(!mmap_test(32*i+j))found++; + else found=0; + if(found==x)return 32*i+j; + } + + return -1; +} + void pmmngr_init_region (uint32_t base, uint32_t size) { uint32_t align = base / PMMNGR_BLOCK_SIZE; @@ -95,14 +106,36 @@ void* pmmngr_alloc_block () if (frame == -1) { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"OUT OF MEMORY"); + panic(FOOLOS_MODULE_NAME,"OUT OF MEMORY (alloc_block)"); return 0; //out of memory } mmap_set (frame); + mem_free_blocks--; + + uint32_t addr = frame * PMMNGR_BLOCK_SIZE; + + return (void*)addr; +} + +void* pmmngr_alloc_blocks (uint32_t size) +{ + + int frame = mmap_first_free_s (size); + + if (frame == -1) + { + panic(FOOLOS_MODULE_NAME,"OUT OF MEMORY (alloc_blocks)"); + return 0; //out of memory + } + + for (int i=0; i