UnnamedOS
pmm.c File Reference
#include <common.h>
#include <string.h>
#include <mem/pmm.h>
#include <boot/multiboot.h>
+ Include dependency graph for pmm.c:

Go to the source code of this file.

Macros

#define PAGE_SIZE   4096
 4KB pages
 
#define PAGE_SHIFT   12
 bits to shift to get page (2^12=4096)
 
#define MEMORY_SIZE   0x100000000
 4GB address space
 
#define TYPE_BITS   2
 number of bits per page entry
 
#define PAGE_NUMBER   (MEMORY_SIZE / PAGE_SIZE)
 total number of pages
 
#define ENTRIES   1024
 number of entries in a page table
 
#define PAGES_PER_DWORD   (32 / TYPE_BITS)
 pages in each bitmap entry
 
#define PAGES_BER_BYTE   (8 / TYPE_BITS)
 pages per bitmap entry byte
 
#define TYPE_MASK   (0xFFFFFFFF >> (32 - TYPE_BITS))
 calc 2^TYPE_BITS-1
 
#define BITMAP_INIT   0x55555555
 0b0101...01, use PMM_RESERVED
 
#define BIT_CHECK(val, bit)   (((val) >> (bit)) & 1)
 checks a bit in a given value
 
#define BITMAP_SET(idx)    (bitmap[(idx) / 32] |= 1 << ((idx) % 32))
 sets a bit in the memory bitmap
 
#define BITMAP_CLEAR(idx)    (bitmap[(idx) / 32] &= ~(1 << ((idx) % 32)))
 clears a bit in the memory bitmap
 

Functions

static void pmm_bitmap_set (uint32_t idx, uint32_t value)
 Sets a bitmap entry to a value. More...
 
static uint32_t pmm_bitmap_get (uint32_t idx)
 Returns a bitmap entry. More...
 
static void pmm_use_kernel_memory ()
 Marks all kernel memory as used.
 
void pmm_init ()
 Initializes the PMM. More...
 
uint32_t pmm_get_page (void *ptr, uint32_t offset)
 Returns to which page a given memory address belongs. More...
 
void * pmm_get_address (uint32_t page, uint32_t offset)
 Returns a memory address belonging to a given page. More...
 
void pmm_use (void *ptr, size_t len, pmm_flags_t flags, char *tag)
 Marks page frames for a given memory range as used or unused. More...
 
static void * pmm_find_free (size_t len)
 Finds free page frames. More...
 
void * pmm_alloc (size_t len, pmm_flags_t flags)
 Allocates page frames. More...
 
void pmm_free (void *ptr, size_t len)
 Frees page frames. More...
 
pmm_flags_t pmm_check (void *ptr)
 Returns whether a page frame is used or unused. More...
 
void pmm_dump (void *ptr, size_t len)
 Dumps information on page frames for a given memory range. More...
 
uint32_t pmm_get_highest_kernel_page ()
 Returns the highest page used by the kernel. More...
 

Variables

static uint32_t bitmap [PAGE_NUMBER/PAGES_PER_DWORD]
 Holds information on used page frames. More...
 
static uint32_t highest_kernel_page = 0
 remember the highest kernel page
 
const void kernel_start
 start of the kernel section
 
const void kernel_end
 end of the kernel section
 
const void main_kernel_stack_end
 end of the main kernel stack
 
static void * main_kernel_stack_start
 start of the main kernel stack More...