diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-09-04 16:19:52 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-09-04 16:19:52 +0200 |
| commit | 44dcbdf16674bc727503ca748f95eec847755b2f (patch) | |
| tree | 6dd5a8353ffa22170b46a2c28d5268d852224549 /kernel/mem.c | |
| parent | 75c46037e742f07001fafc5a093b27556d2490c9 (diff) | |
cleanup and improvements in physical mem manager.
Diffstat (limited to 'kernel/mem.c')
| -rw-r--r-- | kernel/mem.c | 57 |
1 files changed, 45 insertions, 12 deletions
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<size; i++) + { + mmap_set (frame+i); + mem_free_blocks--; + } uint32_t addr = frame * PMMNGR_BLOCK_SIZE; - mem_free_blocks--; return (void*)addr; } |
