A poorly written OS for the x86 arch. (WIP)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
eOS/kernel/memory.c

71 lines
1.6 KiB

3 years ago
#include "memory.h"
3 years ago
#include "../drivers/vga.h"
3 years ago
// https://wiki.osdev.org/Page_Frame_Allocation
// page = block
// MAX_BLOCK_SIZE_IN_BITS/8 bytes
// i.e. : bit i of byte n define status of block 8n+i
// block = 8n+i
3 years ago
// in 32-bit mode, we have access to 2^32 blocks
// which is (2^32)*BLOCK_SIZE blocks
// and with a blocksize of 1024, we git around 4.3 trillion blocks
// which is more than enough
3 years ago
3 years ago
#define CHECK_BITMAP(map, idx) ((map) & (1<<(idx)))
3 years ago
#define BLOCK_TO_MEMP(idx) (pointer)(PM_MEM_START + (idx*BLOCK_SIZE))
3 years ago
3 years ago
3 years ago
static int bitmap = 0;
3 years ago
static uint last_block;
3 years ago
void mod_bitmap(uint bit, uint bflag) {
3 years ago
// create a bitmask that will be applied to the bitmap
int bitmask = 1 << bit;
// apply the bitmask, resulting in the bit:n bit will set
3 years ago
// set to bflag
bitmap = (((bitmap & ~bitmask)) | (bflag << bit));
3 years ago
}
3 years ago
3 years ago
pointer block_alloc(uint blockidx) {
int block_bflag;
block_bflag = CHECK_BITMAP(bitmap, blockidx);
3 years ago
if( block_bflag == BM_FREE ) { // check if block is free
3 years ago
println("Alloc!", DEFAULT_COLOR);
mod_bitmap(blockidx, 1);
3 years ago
last_block = blockidx;
3 years ago
return BLOCK_TO_MEMP(blockidx);
3 years ago
} else {
println("ERROR! Attemped to allocate non-free block.", 0x0c);
3 years ago
return 0;
3 years ago
}
}
3 years ago
void block_free(uint blockidx) {
println("Dealloc block...", DEFAULT_COLOR);
mod_bitmap(blockidx, BM_FREE);
3 years ago
last_block = blockidx;
}
void pm_alloc_range(uint start, uint end, bool force) {
uint idx_start;
uint idx_end;
// calculate idx_start and idx_end
// if not force, check if avaliable
// allocate (if permitted)
}
3 years ago
/*
3 years ago
pointer pm_malloc(uint block_count) {
3 years ago
3 years ago
}
3 years ago
*/