diff options
| -rw-r--r-- | kernel/mem.c | 112 |
1 files changed, 98 insertions, 14 deletions
diff --git a/kernel/mem.c b/kernel/mem.c index 1bb4109..e1253b1 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -9,12 +9,16 @@ //! 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 -static uint32_t _mmngr_memory_map[129*1024]; +//uint32_t _mmngr_memory_map[MEM_BITMAP_SIZE]; +uint32_t *_mmngr_memory_map; + static uint32_t mem_free_blocks; // bit funcs! - void mmap_set(int bit) { _mmngr_memory_map[bit / 32] |= (1 << (bit % 32)); @@ -30,18 +34,19 @@ int mmap_test(int bit) return _mmngr_memory_map[bit / 32] & (1 << (bit % 32)); } -/// - -int mmap_first_free () { +// +int mmap_first_free () +{ //! find the first free bit uint32_t i; int j; - - for (i=0; i< 128 ; i++) + for (i=0; i< MEM_BITMAP_SIZE ; i++) if (_mmngr_memory_map[i] != 0xffffffff) - for (j=0; j<32; j++) { //! test each bit in the dword + for (j=0; j<32; j++) + { + //! test each bit in the dword int bit = 1 << j; if (! (_mmngr_memory_map[i] & bit) ) @@ -49,17 +54,21 @@ int mmap_first_free () { } return -1; + } -void pmmngr_init () { - +void pmmngr_init () +{ //! By default, all of memory is in use // memset (_mmngr_memory_map, 0xf, 128 ); int i; - for(i=0;i++;i<128*1024) + + for(i=0;i<MEM_BITMAP_SIZE;i++) { _mmngr_memory_map[i]=0xffffffff; } + + } void pmmngr_init_region (uint32_t base, uint32_t size) @@ -87,6 +96,79 @@ void pmmngr_init_region (uint32_t base, uint32_t size) //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) + { + scr_put_string_nl("OUT OF MEM!"); + 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) { + + uint32_t addr = (uint32_t*)p; + int frame = addr / PMMNGR_BLOCK_SIZE; + + if(mmap_test(frame)) + { + mmap_unset (frame); + mem_free_blocks++; + } + +} + +void mem_test_2() +{ + //crossing 512MB boundary! + // (do not do this in real, coz it probably is reserved) + //mem_test(0x1fee1000,0x2000f000,0x800); + + int cnt=-1; + uint32_t *addr; + uint32_t *lastaddr; + + do{ + lastaddr=addr; + addr=pmmngr_alloc_block(); + cnt++; + }while(addr!=0); + + + scr_put_string("no mem after : "); + scr_put_hex32(cnt); + scr_put_string_nl(""); + + pmmngr_free_block(lastaddr); + + + cnt=-1; + do{ + lastaddr=addr; + addr=pmmngr_alloc_block(); + cnt++; + }while(addr!=0); + + + 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; @@ -107,7 +189,10 @@ void mem_test(int start, int end, int steps) void mem_init(uint16_t *memmap) { + + _mmngr_memory_map=0x9000; mem_free_blocks=0; + pmmngr_init (); // count available memory uint32_t avail_mem=0; @@ -153,9 +238,8 @@ void mem_init(uint16_t *memmap) scr_put_hex(mem_free_blocks&0xffff); scr_put_string_nl(""); - //crossing 512MB boundary! - // (do not do this in real, coz it probably is reserved) - //mem_test(0x1fee1000,0x2000f000,0x800); + + } |
