From 85dcc9332dae2822a92dfd6314b217011d27891b Mon Sep 17 00:00:00 2001 From: antifallobst Date: Fri, 10 Feb 2023 18:55:22 +0100 Subject: [PATCH] docs: documented page maps --- .wiki/Kernel-documentation.md | 69 +++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/.wiki/Kernel-documentation.md b/.wiki/Kernel-documentation.md index 9f0b1b4..fed9249 100644 --- a/.wiki/Kernel-documentation.md +++ b/.wiki/Kernel-documentation.md @@ -99,6 +99,75 @@ This is kind of the low level version of free. #### `pframe_free_multi(address, n)` - function (void) [Thread Safe] Frees the page at the given address, plus *n* pages after that page. +### page_map.h + +#### `VIRTUAL_ADDRESS_MAX` - macro +The highest mappable virtual address. +4 level page maps have a maximum address space of 256TB. + +#### `page_map_flag_E` - enum + - **Present** - This indicates if the entry is used or should be ignored. Automatically set when mapping a page. + - **Read & Write** - A mapped Page is always readable. This flag allows writing to that page. + - **User Super** - If set, user mode access to the page is allowed. + - **Write Through** - Enables _Write Through Caching_ for this page. + - **Cache Disabled** - If this bit is set, the page won't be cached. + - **Accessed** - Set by the CPU, when this PDE or PTE was read. Won't be reset by the CPU. + - **Larger Pages** - Set when the page has been modified. + - **Custom 1 - 3** - Not used in NoxOS. + - **No Execute** - When this bit is set, the CPU won't execute code that lies in that page. + +#### `page_map_T` - struct [page aligned] +This struct contains 512 entries. +These entries contain an address and flags. +The addresses link like this: + - **PML4** --> **Page Directory** or _1GB Page_ + - **Page Directory** --> **Page Table** or _2MB Page_ + - **Page Table** --> _4KB Page_ + +A pointer to a `page_map_T` can be loaded into `cr3` to load this pagemap. + +#### `page_map_create()` - function (page_map_T*) +Allocates a `page_map_T` and returns a pointer to it. + +#### `page_map_fetch_current()` - function (page_map_T*) [ASM implementation] +This function will return the page map, that is currently loaded. +To achieve this, it just reads the `cr3` value. + +#### `page_map_load(page_map*)` - function (void) [ASM implementation] +Loads the given page map. +To achieve this, it writes the `cr3` value. + +#### `page_map_map_memory(page_map*, virtual_address, physical_address, flags)` - function (void) +This maps **_physical_address_** to **_virtual_address_** in **_page_map_**. +The **_flags_** will be applied to the page mapping / page table entry. +It always applies the _Present_ flag. + +#### `page_map_unmap_memory(page_map*, virtual_address)` - function (void) +Removes a page mapping from the **_page_map_**. +Page map structure intern pages won't be checked if they're still needed or not. + +#### `page_map_destruct(page_map*)` - function (void) +Clears a page map and frees all page map structure intern pages. + +#### `page_map_entry_set_flags(entry, uint64_t flags)` - function (void) +This will set the provided flags to a page map entry. + +#### `page_map_entry_get_flag(entry, page_map_flag_E flag)` - function (bool) +Returns if the given flag is set in the page map entry, or not. + +#### `page_map_entry_set_address(entry, void* address)` - function (void) +This will set the provided address to a page map entry. + +#### `page_map_entry_get_address(entry)` - function (void*) +This will read and return the address set in the page map entry. + +#### `paging_init()` - function (void) +Initializes paging. +This reads the current page map set by the kernel and writes it to `g_kernel_page_map`. + +#### `g_kernel_page_map` - global variable +The kernels page map. This page map is provided by the bootloader and read from `cr3` at `paging_init`. + ## platform ### cpu.h