KERNEL: Pre-kernel sets up the physical memory manager.
* BUG: allocated blocks is possibly incorrect! * prekernel no longer gets compiled as being in physical memory
This commit is contained in:
@ -1,66 +1,46 @@
|
||||
#include "./PhysicalMemoryManager.h"
|
||||
#define BLOCK_SIZE 4092
|
||||
#define IS_ALIGNED(addr, align) !((addr) & ~((align) - 1))
|
||||
#define ALIGN(addr, align) (((addr) & ~((align) - 1 )) + (align))
|
||||
|
||||
const uint32_t KERNEL_OFFSET = 0xC0000000;
|
||||
extern uint32_t* boot_page_directory;
|
||||
extern uint32_t* boot_page_table;
|
||||
extern uint32_t* multiboot_page_table;
|
||||
|
||||
PhysicalMemoryManagerInfoBlock* PMMInfoBlock;
|
||||
uint32_t* memoryBitMap;
|
||||
uint32_t pmmap_size;
|
||||
uint32_t max_blocks;
|
||||
int used_blocks;
|
||||
|
||||
void SetupPhysicalMemoryManager( BootInfoBlock* Bootinfo)
|
||||
|
||||
void SetupPhysicalMemoryManager(uint32_t mapAddress, uint32_t memorySize )
|
||||
{
|
||||
|
||||
// NOTE: We should move our bitmap to just after the end of our kernel instead
|
||||
PMMInfoBlock = (PhysicalMemoryManagerInfoBlock*) ( ((uint32_t)MemoryMapHeap_pptr + 80 ) + KERNEL_OFFSET );
|
||||
/*
|
||||
/*
|
||||
Every byte contains 8 pages
|
||||
A page is 4096 kib
|
||||
Every block (1 bit) represent an page
|
||||
*/
|
||||
|
||||
// Calculate the maximum number of blocks
|
||||
int maximum_blocks = (uint32_t)Bootinfo->MemorySize / BLOCK_SIZE / 8;
|
||||
PMMInfoBlock->max_blocks = maximum_blocks;
|
||||
PMMInfoBlock->used_blocks = 0;
|
||||
// Set the maximum number of blocks
|
||||
max_blocks = (uint32_t)memorySize / BLOCK_SIZE ;
|
||||
printf("Max Blocks: %d\n", max_blocks);
|
||||
|
||||
// put the map after the gdt
|
||||
PMMInfoBlock->memoryBitMap = (uint32_t*) ( 0xC010b100) ;
|
||||
// Set size of the bitmap
|
||||
uint32_t bitmap_size = max_blocks / 32;
|
||||
printf("Bitmap size: %d bytes\n",bitmap_size);
|
||||
|
||||
// Set blocks used to zero
|
||||
used_blocks = 0;
|
||||
|
||||
//Size of memory map
|
||||
uint32_t memMap_size = PMMInfoBlock->max_blocks / 8;
|
||||
// set the address of the memory bitmap
|
||||
memoryBitMap = (uint32_t*) mapAddress;
|
||||
|
||||
// Set all places in memory as free
|
||||
memset(PMMInfoBlock->memoryBitMap, 0xFF, memMap_size );
|
||||
MemoryInfoBlock* currentBlock = (MemoryInfoBlock*) ((uint32_t)Bootinfo->MemoryMap + 0xC0000000) ;
|
||||
|
||||
printf( "Starting address: 0x%x\n", currentBlock);
|
||||
while( (uint32_t)currentBlock->next != 0x0 )
|
||||
{
|
||||
|
||||
if(IS_AVAILABLE_MEM(currentBlock->type)){
|
||||
printf("skip!\n");
|
||||
}
|
||||
else{
|
||||
printf("allocate region 0x%x of size %d bytes\n", currentBlock->Base_addr, currentBlock->Memory_Size);
|
||||
// allocate_region( currentBlock->Base_addr, currentBlock->Memory_Size); // allocate region causes #PF Exception
|
||||
}
|
||||
|
||||
currentBlock = (MemoryInfoBlock*) ((uint32_t)currentBlock->next + 0xC0000000 );
|
||||
|
||||
}
|
||||
|
||||
uint32_t kernel_size = ((uint32_t)&kernel_end - (uint32_t)&kernel_begin ) - KERNEL_OFFSET;
|
||||
|
||||
printf("kernel size in memory: 0x%x\n", kernel_size);
|
||||
allocate_region((uint32_t)&kernel_begin, kernel_size);
|
||||
|
||||
printf("allocate BIOS region\n");
|
||||
allocate_region (0x0000000, 0x00100000);
|
||||
memset(memoryBitMap, 0xFFFFFFFF, max_blocks / 32 );
|
||||
}
|
||||
|
||||
// NOTE: This can only give blocks of 4kb at a time!
|
||||
// We might at some point want to allocate multiple blocks at once.
|
||||
void* allocate_block() {
|
||||
uint8_t blocks_available = PMMInfoBlock->max_blocks - PMMInfoBlock->used_blocks;
|
||||
uint8_t blocks_available = max_blocks - used_blocks;
|
||||
// Are there any blocks available?
|
||||
if( blocks_available <= 0)
|
||||
{
|
||||
@ -69,7 +49,7 @@ void* allocate_block() {
|
||||
}
|
||||
|
||||
// Find 1 free block somewhere
|
||||
int free_block_index = bitmap_first_unset(PMMInfoBlock->memoryBitMap, PMMInfoBlock->max_blocks / 8 );
|
||||
int free_block_index = bitmap_first_unset(memoryBitMap, max_blocks / 8 );
|
||||
|
||||
if(free_block_index == -1)
|
||||
{
|
||||
@ -82,10 +62,10 @@ void* allocate_block() {
|
||||
printf("Somethings wrong!!!\n");
|
||||
|
||||
// Set the block to be used!
|
||||
bitmap_unset(PMMInfoBlock->memoryBitMap, free_block_index);
|
||||
bitmap_unset(memoryBitMap, free_block_index);
|
||||
// Increase the used_block count!
|
||||
PMMInfoBlock->used_blocks++;
|
||||
printf("used blocks: 0x%x\n", PMMInfoBlock->used_blocks);
|
||||
used_blocks++;
|
||||
printf("used blocks: 0x%x\n", used_blocks);
|
||||
// return the pointer to the physical address
|
||||
return (void*) (BLOCK_SIZE * free_block_index);
|
||||
}
|
||||
@ -99,9 +79,9 @@ void free_block(void* p) {
|
||||
int index = ((uint32_t) p) / BLOCK_SIZE;
|
||||
|
||||
// set the block to be free
|
||||
bitmap_set(PMMInfoBlock->memoryBitMap, index);
|
||||
PMMInfoBlock->used_blocks--;
|
||||
printf("used blocks: 0x%x, after free\n", PMMInfoBlock->used_blocks);
|
||||
bitmap_set(memoryBitMap, index);
|
||||
used_blocks--;
|
||||
printf("used blocks: 0x%x, after free\n", used_blocks);
|
||||
|
||||
}
|
||||
|
||||
@ -111,28 +91,26 @@ void allocate_region(uint32_t startAddress, uint32_t size) {
|
||||
|
||||
int NumberOfBlocksToAllocate = ( size / 1024) / 4 / 8 + 1;
|
||||
int startBlock = (startAddress / 1024) / 4 / 8 ;
|
||||
|
||||
|
||||
for( int i = 0; i < NumberOfBlocksToAllocate; i++)
|
||||
{
|
||||
bitmap_unset(PMMInfoBlock->memoryBitMap, startBlock+ i);
|
||||
PMMInfoBlock->used_blocks++;
|
||||
bitmap_unset(memoryBitMap, startBlock + i);// allocate region causes #PF Exception
|
||||
used_blocks++;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void deallocate_region(uint32_t StartAddress , uint32_t size ) {
|
||||
// reverse of what happened in allocate_region
|
||||
|
||||
int NumberOfBlocks = (size / 1024) / 4 / 8 + 1;
|
||||
int startBlock = (StartAddress / 1024) / 4 / 8;
|
||||
|
||||
for(int i = 0; i < NumberOfBlocks; i++)
|
||||
{
|
||||
bitmap_set(PMMInfoBlock->memoryBitMap, startBlock + i);
|
||||
PMMInfoBlock->used_blocks --;
|
||||
bitmap_set(memoryBitMap, startBlock + i);
|
||||
used_blocks --;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int GetUsedBlocks (){
|
||||
return used_blocks;
|
||||
}
|
||||
|
@ -5,22 +5,14 @@
|
||||
#include "../lib/mem.h"
|
||||
#include "../bitmap.h"
|
||||
|
||||
// Asumming i386 for now!
|
||||
#define BLOCK_SIZE 4092
|
||||
|
||||
#define IS_ALIGNED(addr, align) !((addr) & ~((align) - 1))
|
||||
#define ALIGN(addr, align) (((addr) & ~((align) - 1 )) + (align))
|
||||
|
||||
struct PhysicalMemoryManagerInfoBlock
|
||||
{
|
||||
uint32_t* memoryBitMap;
|
||||
uint32_t pmmap_size;
|
||||
uint32_t max_blocks;
|
||||
int used_blocks;
|
||||
};
|
||||
void SetupPhysicalMemoryManager(uint32_t mapAddress, uint32_t memorySize);
|
||||
|
||||
void SetupPhysicalMemoryManager(BootInfoBlock* memory);
|
||||
void free_block(void* ptr);
|
||||
void* allocate_block();
|
||||
void allocate_region(uint32_t, uint32_t);
|
||||
void deallocate_region(uint32_t , uint32_t );
|
||||
void free_block(void* ptr);
|
||||
|
||||
void allocate_region(uint32_t address, uint32_t size);
|
||||
void deallocate_region(uint32_t address, uint32_t size);
|
||||
|
||||
int GetUsedBlocks();
|
@ -1,5 +1,5 @@
|
||||
#include "VirtualMemoryManager.h"
|
||||
|
||||
#define ALIGN(addr, align) (((addr) & ~((align) - 1 )) + (align))
|
||||
extern uint32_t boot_page_directory[1024] ;
|
||||
extern uint32_t boot_page_table[1024];
|
||||
|
||||
|
Reference in New Issue
Block a user