diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-11-26 17:42:33 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-11-26 17:42:33 +0100 |
| commit | 9c8cfc2e52b0446f7cab14325028075760869b45 (patch) | |
| tree | b85a0f9403bd38ac7947cdf709de787241509533 /kernel/mem.c | |
| parent | 786bd02b01d80e335d4445698d721213a1884ff5 (diff) | |
further cleanup
Diffstat (limited to 'kernel/mem.c')
| -rw-r--r-- | kernel/mem.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/kernel/mem.c b/kernel/mem.c index b2ab6ad..cf0c673 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -1,7 +1,8 @@ #define FOOLOS_MODULE_NAME "mem" +#include <stdint.h> + #include "config.h" -#include "lib/int/stdint.h" #include "lib/logger/log.h" // logger facilities //! 8 blocks per byte @@ -13,12 +14,20 @@ //! block alignment ??? TODO: what is this!? #define PMMNGR_BLOCK_ALIGN PMMNGR_BLOCK_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; +char *memmap_type_to_string[]= + { + "Usable", + "Reserved", + "ACPI reclaimable", + "ACPI NVS", + "Bad Memory" + }; // bit funcs! void mmap_set(int bit) { @@ -34,10 +43,13 @@ int mmap_test(int bit) { return _mmngr_memory_map[bit / 32] & (1 << (bit % 32)); } +// +// By default, Set all of memory is in use void pmmngr_init () { - // By default, all of memory is in use + mem_free_blocks=0; + for(int i=0;i<mem_array_size;i++) { _mmngr_memory_map[i]=0xffffffff; @@ -57,6 +69,7 @@ int mmap_first_free () return -1; } +/* //find the first free consecutive x bits int mmap_first_free_s (uint32_t x) { @@ -73,6 +86,7 @@ int mmap_first_free_s (uint32_t x) return -1; } +*/ void pmmngr_init_region (uint32_t base, uint32_t size) { @@ -96,7 +110,6 @@ void pmmngr_deinit_region (uint32_t base, uint32_t size) mmap_set (align++); mem_free_blocks--; } - } void* pmmngr_alloc_block () @@ -116,6 +129,7 @@ void* pmmngr_alloc_block () return (void*)addr; } +/* void* pmmngr_alloc_blocks (uint32_t size) { @@ -138,6 +152,7 @@ void* pmmngr_alloc_blocks (uint32_t size) return (void*)addr; } +*/ void pmmngr_free_block (void* p) { @@ -151,17 +166,14 @@ void pmmngr_free_block (void* p) } } + void mem_init(uint16_t *memmap,uint16_t entries) { - - // init free blocks counter - mem_free_blocks=0; + // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"the memory map contains %d entries.",entries); // count available mem uint32_t total_mem=0, highest_end=0, high_end_low=0,last_end=0; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"the memory map contains %d entries.",entries); - // preserve pointer uint16_t save=memmap; @@ -173,10 +185,11 @@ void mem_init(uint16_t *memmap,uint16_t entries) +(((uint32_t)memmap[5])<<16)+memmap[4]; #ifdef MEM_PRINT_MEMORYMAP - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"type: %02d / range: 0x%08x - 0x%08x", - memmap[8],low_end,high_end); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"range: 0x%08x - 0x%08x (%s)", + low_end,high_end,memmap_type_to_string[memmap[8]-1]); #endif + //reclaimable OR usable if(memmap[8]==1||memmap[8]==3) { total_mem+=memmap[4]+(memmap[5]<<16); @@ -201,7 +214,6 @@ void mem_init(uint16_t *memmap,uint16_t entries) int blocks=highest_end/4096+1; mem_array_size=blocks/32+1; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Highest end area: 0x%08X - 0x%08X",high_end_low,highest_end); if(highest_end-high_end_low<mem_array_size*4) { @@ -223,8 +235,9 @@ void mem_init(uint16_t *memmap,uint16_t entries) memmap+=12; } - // here is somewhere our kernel stuff ;) // TODO!! better. - pmmngr_deinit_region(0x0,0x600000); + // here is somewhere our kernel stuff. + // reserve 4Mb (0x100000-0x500000) for kernel and ext2 img + pmmngr_deinit_region(0x0,0x500000); // and here is the memory map that we JUST created! pmmngr_deinit_region(_mmngr_memory_map,mem_array_size*4); |
