summaryrefslogtreecommitdiff
path: root/kernel/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/mem.c')
-rw-r--r--kernel/mem.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/kernel/mem.c b/kernel/mem.c
index dea1284..8dfc6ea 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -1,13 +1,10 @@
-
-
#include <stdint.h>
-
#include "kernel.h"
#include "multiboot.h"
#define PMMNGR_BLOCKS_PER_BYTE 8
#define PMMNGR_BLOCK_SIZE 4096
-#define PMMNGR_MAX_BLOCKS 1048576
+#define PMMNGR_MAX_BLOCKS 1048576 // 4096*1048576 = 2^32 bytes (maxium addressable memory ~4GB)
#define PMMNGR_MAP_SIZE PMMNGR_MAX_BLOCKS/PMMNGR_BLOCKS_PER_BYTE/4
// defined in linker.ld and multiboot.s
@@ -18,7 +15,7 @@ extern uint32_t stack_bottom[];
//memory map bit array. Each bit represents a 4KB memory block,
//so uint32_t represents 8*4 blocks
-static uint32_t _mmngr_memory_map[PMMNGR_MAP_SIZE];
+static uint32_t _mmngr_memory_map[PMMNGR_MAP_SIZE]; //32Kb
static uint32_t mem_free_blocks; //number of free blocks
static uint32_t mem_max_block; //index of highest usable block
@@ -173,8 +170,8 @@ uint32_t mem_init(multiboot_information *info)
uint64_t mem_start=mmap->base_addr;
uint64_t mem_end=mmap->base_addr+mmap->length;
- klog("%08X - %08X / type: %s, (size: %d)",
- (uint32_t)mem_start, (uint32_t)mem_end, memmap_type_to_string[mmap->type-1], mmap->size);
+ klog("%08X - %08X (%d bytes)/ type: %s, (size: %d)",
+ (uint32_t)mem_start, (uint32_t)mem_end, (uint32_t)(mem_end-mem_start), memmap_type_to_string[mmap->type-1], mmap->size);
uint32_t mem=mmap->length;
@@ -204,25 +201,26 @@ uint32_t mem_init(multiboot_information *info)
mem_min_block=mod->mod_end/PMMNGR_BLOCK_SIZE+1;
- //pmmngr_deinit_region(mod->mod_start,((uint32_t)mod->mod_end-(uint32_t)mod->mod_start)+1);
+ pmmngr_deinit_region(mod->mod_start,((uint32_t)mod->mod_end-(uint32_t)mod->mod_start)+1);
mod++;
}
}
// deinitialize kernel
- //pmmngr_deinit_region(kernel_start,((uint32_t)kernel_end-(uint32_t)kernel_start)+1);
+ pmmngr_deinit_region(kernel_start,((uint32_t)kernel_end-(uint32_t)kernel_start)+1);
// we deinit everything below mem_min_block anyway
- pmmngr_deinit_region(0,mem_min_block*PMMNGR_BLOCK_SIZE);
+ //pmmngr_deinit_region(0,mem_min_block*PMMNGR_BLOCK_SIZE);
+
+ pmmngr_deinit_region(0,4096); // deinit first page (coz address=0 reserved for failure)
klog("Usable ~%d / %d MB ",mem_free_blocks*4096/1024/1024,total_mem/1024/1024);
klog(
- "Free 4K blocks: %d (first free: 0x%08X)",mem_free_blocks,mem_min_block);
+ "Free 4K blocks: %d (first free: %d)",mem_free_blocks,mem_min_block);
return mem_min_block;
-
}