#pragma once #include "common.h" #include "isr.h" #include typedef struct page { uint32_t present : 1; // page present in memory uint32_t rw : 1; // ro if clear, rw if set uint32_t user : 1; // supervisor level only if clear uint32_t accessed : 1; // has been accessed since last referesh uint32_t dirty : 1; // has been written to since last refresh uint32_t unused : 7; // reserved and unused bits uint32_t frame : 20; // frame address (right shift 12 bits) } page_t; typedef struct page_table { page_t pages[1024]; } page_table_t; typedef struct { // array of pointers to pagetables page_table_t *tables[1024]; // array of pointers to tables above but at the *physical* loc // so they can be loaded into cr3 uint32_t tablesPhysical[1024]; uint32_t physicalAddr; } page_directory_t; // sets up paging void initialize_paging(void); // causes the specified page directory to be loaded // into the cr3 register void switch_page_directory(page_directory_t *new); // retrieves a pointer to the page requires // if make == 1, if the pagetable in which page // should reside inst there create it page_t *get_page(uint32_t address, int make, page_directory_t *dir); // handler for page faults void page_fault(registers_t *regs);