MyOS Kernel
paging.c File Reference
#include "../../pmem.h"
#include "../../vga_err.h"
#include "../halt.h"
#include "../paging.h"
#include "arch_consts.h"
#include <stdint.h>
#include <stdlib.h>

Functions

static char is_page_present (size_t page)
 
void map_pages (void *virt_addr_ptr, void *phys_addr_ptr, int num_pages, char usr, char wr)
 
void * find_free_pages (int num_pages)
 
void * alloc_pages (int num_pages)
 
void * virt_to_phys (void *virt_addr_arg)
 
void alloc_pages_virt (int num_pages, void *addr)
 
static void invl_page (void *addr)
 
void * paging_new_address_space ()
 
void load_address_space (void *cr3)
 
void unmap_pages (void *start_virt, int num_pages)
 
void paging_init ()
 
void * get_cr3 ()
 

Variables

static uint32_t page_directory [1024]
 The kernel process's page directory.
 
static uint32_t kern_page_tables [NUM_KERN_FRAMES]
 The page tables where the kernel binary is mapped in.
 
static uint32_t kstack_page_tables [218 *1024]
 Page tables for thread kernel stacks.
 
static uint32_t kmalloc_page_tables [4 *1024]
 Page tables for the kmalloc heap.
 
static uint32_t * pagdirmap =(uint32_t*)0xFFFFF000
 Pointer to the page directory entries in the recursive mapping.
 
static uint32_t * page_table_map =(uint32_t*)0xFFC00000
 Pointer to the page table entries in the recursive mapping.
 

Function Documentation

◆ alloc_pages()

void* alloc_pages ( int  num_pages)

Allocate virtual pages & map them to physical memory.

Parameters
num_pagesThe number of pages to allocate.
Returns
a pointer to the allocated pages.

◆ alloc_pages_virt()

void alloc_pages_virt ( int  num_pages,
void *  addr 
)

Allocate virtual pages at a specific address & map them to physical memory.

Parameters
num_pagesThe number of pages to allocate.
addrThe adress to start allocation at.

◆ find_free_pages()

void* find_free_pages ( int  num_pages)

Finds free virtual pages and returns the start address

Parameters
num_pagesThe minimum size of the free area
Returns
the start of the free area

◆ get_cr3()

void* get_cr3 ( )

Get the current address space

Returns
a pointer to the current address space in physical memory.

◆ invl_page()

static void invl_page ( void *  addr)
static

Invalidates a page in the TLB,

Parameters
addrThe address of the page to invalidate.

◆ is_page_present()

static char is_page_present ( size_t  page)
static

Checks whether a page is present

Parameters
pageThe page number to check
Returns
Whether the page is present

◆ load_address_space()

void load_address_space ( void *  cr3)

Load an address space

Parameters
cr3The address space to load

◆ map_pages()

void map_pages ( void *  virt_addr_ptr,
void *  phys_addr_ptr,
int  num_pages,
char  usr,
char  wr 
)

Map virtual pages to physical frames.

Parameters
virt_addr_ptrThe start of the virtual range to map.
phys_addr_ptrThe start of the physical range to map.
num_pagesThe number of pages to map.
usrAre the pages acessible by user mode code
wrAre the pages writable by user mode code (kernel always has write permissions)

◆ paging_init()

void paging_init ( )

Initialize paging

◆ paging_new_address_space()

void* paging_new_address_space ( )

Create a new address space

Returns
a pointer to the new address space in physical memory.

◆ unmap_pages()

void unmap_pages ( void *  start_virt,
int  num_pages 
)

Unmap virtual pages,

Parameters
start_virtThe start of the virtual range to unmap.
num_pagesThe number of pages to map.

◆ virt_to_phys()

void* virt_to_phys ( void *  virt_addr)

Convert a virtual address to a physical one.

Parameters
virt_addrThe virtual address to convert
Returns
the physical adress it maps to, or NULL if it is not mapped.