Turnstone Operating System
Loading...
Searching...
No Matches
paging.h File Reference

memory paging and frame allocation interface More...

#include <memory.h>
#include <memory/frame.h>

Classes

struct  memory_page_entry_t
 
struct  memory_page_table_t
 
struct  memory_page_table_context_t
 

Macros

#define ___MEMORY_PAGE_H   0
 
#define MEMORY_PAGING_INDEX_COUNT   512
 
#define MEMORY_PAGING_PAGE_SIZE   0x1000
 
#define MEMORY_PAGING_INTERNAL_FRAMES_MAX_COUNT   0x200
 
#define MEMORY_PAGING_PAGE_ALIGN   MEMORY_PAGING_PAGE_SIZE
 
#define MEMORY_PAGING_PAGE_LENGTH_4K   (1 << 12)
 
#define MEMORY_PAGING_PAGE_LENGTH_2M   (1 << 21)
 
#define MEMORY_PAGING_PAGE_LENGTH_1G   (1 << 30)
 
#define memory_paging_get_table()
 
#define memory_paging_add_page_with_p4(pt, va, fa, t)
 
#define memory_paging_add_page(va, fa, t)
 
#define memory_paging_delete_page_ext(p4, va, faptr)
 
#define memory_paging_delete_page(va, faptr)
 
#define memory_paging_clone_pagetable()
 
#define memory_paging_move_pagetable(h)
 
#define memory_paging_clone_current_pagetable_to_frames_ext(h, fa)
 
#define memory_paging_clone_current_pagetable_to_frames(fa)
 
#define memory_paging_destroy_pagetable(p)
 
#define memory_paging_get_physical_address(va, paptr)
 
#define memory_paging_get_frame_address_ext(p4, va, fa)
 
#define memory_paging_get_frame_address(va, faptr)
 
#define memory_paging_toggle_attributes(va, t)
 
#define memory_paging_set_user_accessible(va)
 
#define memory_paging_clear_page(va, t)
 
#define MEMORY_PT_GET_P4_INDEX(u64)
 
#define MEMORY_PT_GET_P3_INDEX(u64)
 
#define MEMORY_PT_GET_P2_INDEX(u64)
 
#define MEMORY_PT_GET_P1_INDEX(u64)
 
#define MEMORY_PAGING_GET_FA_FOR_RESERVED_VA(va)
 
#define MEMORY_PAGING_GET_VA_FOR_RESERVED_FA(fa)
 
#define memory_paging_add_va_for_frame(vas, f, t)
 
#define memory_paging_delete_va_for_frame(vas, f)
 

Typedefs

typedef struct memory_page_entry_t memory_page_entry_t
 short hand for struct
 
typedef struct memory_page_table_t memory_page_table_t
 short hand for struct
 
typedef enum memory_paging_internal_frame_init_state_t memory_paging_internal_frame_init_state_t
 
typedef struct memory_page_table_context_t memory_page_table_context_t
 short hand for struct
 
typedef enum memory_paging_page_type_e memory_paging_page_type_t
 short hand for enum
 
typedef enum memory_paging_clear_type_t memory_paging_clear_type_t
 

Enumerations

enum  memory_paging_internal_frame_init_state_t { MEMORY_PAGING_INTERNAL_FRAME_INIT_STATE_UNINITIALIZED = 0 , MEMORY_PAGING_INTERNAL_FRAME_INIT_STATE_INITIALIZING = 1 , MEMORY_PAGING_INTERNAL_FRAME_INIT_STATE_INITIALIZED = 2 }
 
enum  memory_paging_page_type_e {
  MEMORY_PAGING_PAGE_TYPE_UNKNOWN = 0 , MEMORY_PAGING_PAGE_TYPE_4K = 1 << 0 , MEMORY_PAGING_PAGE_TYPE_2M = 1 << 1 , MEMORY_PAGING_PAGE_TYPE_1G = 1 << 2 ,
  MEMORY_PAGING_PAGE_TYPE_READONLY = 1 << 4 , MEMORY_PAGING_PAGE_TYPE_NOEXEC = 1 << 5 , MEMORY_PAGING_PAGE_TYPE_USER_ACCESSIBLE = 1 << 6 , MEMORY_PAGING_PAGE_TYPE_WRITE_THROUGH = 1 << 7 ,
  MEMORY_PAGING_PAGE_TYPE_DISABLE_CACHE = 1 << 8 , MEMORY_PAGING_PAGE_TYPE_GLOBAL = 1 << 9 , MEMORY_PAGING_PAGE_TYPE_INTERNAL = 1 << 15 , MEMORY_PAGING_PAGE_TYPE_WILL_DELETED = 1 << 16
}
 page type enum. More...
 
enum  memory_paging_clear_type_t { MEMORY_PAGING_CLEAR_TYPE_DIRTY =1 , MEMORY_PAGING_CLEAR_TYPE_ACCESSED =2 }
 

Functions

memory_page_table_context_tmemory_paging_switch_table (const memory_page_table_context_t *new_table)
 switches p4 page table
 
int8_t memory_paging_add_page_ext (memory_page_table_context_t *p4, uint64_t virtual_address, uint64_t frame_address, memory_paging_page_type_t type)
 creates virtual address frame mapping with adding page
 
int8_t memory_paging_delete_page_ext_with_heap (memory_page_table_context_t *p4, uint64_t virtual_address, uint64_t *frame_address)
 
memory_page_table_tmemory_paging_clone_pagetable_ext (memory_page_table_context_t *table_context)
 
memory_page_table_tmemory_paging_clone_pagetable_to_frames_ext (memory_page_table_context_t *table_context, uint64_t fa)
 
int8_t memory_paging_destroy_pagetable_ext (memory_page_table_context_t *table_context)
 
int8_t memory_paging_get_physical_address_ext (memory_page_table_context_t *table_context, uint64_t virtual_address, uint64_t *physical_address)
 
int8_t memory_paging_toggle_attributes_ext (memory_page_table_context_t *table_context, uint64_t virtual_address, memory_paging_page_type_t type)
 
int8_t memory_paging_set_user_accessible_ext (memory_page_table_context_t *table_context, uint64_t virtual_address)
 
int8_t memory_paging_clear_page_ext (memory_page_table_context_t *table_context, uint64_t virtual_address, memory_paging_clear_type_t type)
 
int8_t memory_paging_add_va_for_frame_ext (memory_page_table_context_t *table_context, uint64_t va_start, frame_t *frm, memory_paging_page_type_t type)
 
int8_t memory_paging_delete_va_for_frame_ext (memory_page_table_context_t *table_context, uint64_t va_start, frame_t *frm)
 
memory_page_table_context_tmemory_paging_build_empty_table (uint64_t internal_frame_address)
 
int8_t memory_paging_reserve_current_page_table_frames (void)
 

Detailed Description

memory paging and frame allocation interface

This work is licensed under TURNSTONE OS Public License. Please read and understand latest version of Licence.

Macro Definition Documentation

◆ ___MEMORY_PAGE_H

#define ___MEMORY_PAGE_H   0

prevent duplicate header error macro

◆ memory_paging_add_page

#define memory_paging_add_page ( va,
fa,
t )
Value:
int8_t memory_paging_add_page_ext(memory_page_table_context_t *p4, uint64_t virtual_address, uint64_t frame_address, memory_paging_page_type_t type)
creates virtual address frame mapping with adding page
Definition paging.64.c:166

add va and fa to defeault p4 table

◆ memory_paging_add_page_with_p4

#define memory_paging_add_page_with_p4 ( pt,
va,
fa,
t )
Value:

add virtual address va to pt page table with frame address fa and page type t uses default heap for mallocs

◆ memory_paging_add_va_for_frame

#define memory_paging_add_va_for_frame ( vas,
f,
t )
Value:
memory_paging_add_va_for_frame_ext(NULL, vas, f, t)

◆ memory_paging_clear_page

#define memory_paging_clear_page ( va,
t )
Value:
memory_paging_clear_page_ext(NULL, va, t)

◆ memory_paging_clone_current_pagetable_to_frames

#define memory_paging_clone_current_pagetable_to_frames ( fa)
Value:
memory_paging_clone_pagetable_to_frames_ext(NULL, fa)

◆ memory_paging_clone_current_pagetable_to_frames_ext

#define memory_paging_clone_current_pagetable_to_frames_ext ( h,
fa )
Value:
memory_paging_clone_pagetable_to_frames_ext(NULL, fa)

◆ memory_paging_clone_pagetable

#define memory_paging_clone_pagetable ( )
Value:
memory_paging_clone_pagetable_ext(NULL)

◆ memory_paging_delete_page

#define memory_paging_delete_page ( va,
faptr )
Value:
memory_paging_delete_page_ext_with_heap(NULL, va, faptr)

◆ memory_paging_delete_page_ext

#define memory_paging_delete_page_ext ( p4,
va,
faptr )
Value:
memory_paging_delete_page_ext_with_heap(p4, va, faptr)

◆ memory_paging_delete_va_for_frame

#define memory_paging_delete_va_for_frame ( vas,
f )
Value:
memory_paging_add_va_for_frame_ext(NULL, vas, f)

◆ memory_paging_destroy_pagetable

#define memory_paging_destroy_pagetable ( p)
Value:
memory_paging_destroy_pagetable_ext(p)

◆ MEMORY_PAGING_GET_FA_FOR_RESERVED_VA

#define MEMORY_PAGING_GET_FA_FOR_RESERVED_VA ( va)
Value:
((typeof(va))((uint64_t)(va)))
unsigned long long uint64_t
Definition types.h:54

◆ memory_paging_get_frame_address

#define memory_paging_get_frame_address ( va,
faptr )
Value:
memory_paging_get_frame_address_ext(NULL, va, faptr)

◆ memory_paging_get_frame_address_ext

#define memory_paging_get_frame_address_ext ( p4,
va,
fa )
Value:
((memory_paging_get_physical_address_ext(p4, va, fa) >> 12) << 12)

◆ memory_paging_get_physical_address

#define memory_paging_get_physical_address ( va,
paptr )
Value:
memory_paging_get_frame_address_ext(NULL, va, paptr)

◆ memory_paging_get_table

#define memory_paging_get_table ( )
Value:
memory_page_table_context_t * memory_paging_switch_table(const memory_page_table_context_t *new_table)
switches p4 page table
Definition paging.64.c:116

return p4 table

◆ MEMORY_PAGING_GET_VA_FOR_RESERVED_FA

#define MEMORY_PAGING_GET_VA_FOR_RESERVED_FA ( fa)
Value:
((typeof(fa))((uint64_t)(fa)))

◆ MEMORY_PAGING_INDEX_COUNT

#define MEMORY_PAGING_INDEX_COUNT   512

how many index has a page

◆ memory_paging_move_pagetable

#define memory_paging_move_pagetable ( h)
Value:
memory_paging_clone_pagetable_ext(NULL)

◆ MEMORY_PAGING_PAGE_ALIGN

#define MEMORY_PAGING_PAGE_ALIGN   MEMORY_PAGING_PAGE_SIZE

memory alignment for a page (4k)

◆ MEMORY_PAGING_PAGE_LENGTH_1G

#define MEMORY_PAGING_PAGE_LENGTH_1G   (1 << 30)

page length for 1G

◆ MEMORY_PAGING_PAGE_LENGTH_2M

#define MEMORY_PAGING_PAGE_LENGTH_2M   (1 << 21)

page length for 2M

◆ MEMORY_PAGING_PAGE_LENGTH_4K

#define MEMORY_PAGING_PAGE_LENGTH_4K   (1 << 12)

page length for 4K

◆ MEMORY_PAGING_PAGE_SIZE

#define MEMORY_PAGING_PAGE_SIZE   0x1000

page size (4K)

◆ memory_paging_set_user_accessible

#define memory_paging_set_user_accessible ( va)
Value:
memory_paging_set_user_accessible_ext(NULL, va)

◆ memory_paging_toggle_attributes

#define memory_paging_toggle_attributes ( va,
t )
Value:
memory_paging_toggle_attributes_ext(NULL, va, t)

◆ MEMORY_PT_GET_P1_INDEX

#define MEMORY_PT_GET_P1_INDEX ( u64)
Value:
((u64 >> 12) & 0x1FF)

gets p1 index of virtual address at long mode

◆ MEMORY_PT_GET_P2_INDEX

#define MEMORY_PT_GET_P2_INDEX ( u64)
Value:
((u64 >> 21) & 0x1FF)

gets p2 index of virtual address at long mode

◆ MEMORY_PT_GET_P3_INDEX

#define MEMORY_PT_GET_P3_INDEX ( u64)
Value:
((u64 >> 30) & 0x1FF)

gets p3 index of virtual address at long mode

◆ MEMORY_PT_GET_P4_INDEX

#define MEMORY_PT_GET_P4_INDEX ( u64)
Value:
((u64 >> 39) & 0x1FF)

gets p4 index of virtual address at long mode

Enumeration Type Documentation

◆ memory_paging_page_type_e

page type enum.

Enumerator
MEMORY_PAGING_PAGE_TYPE_UNKNOWN 

4k page

MEMORY_PAGING_PAGE_TYPE_4K 

4k page

MEMORY_PAGING_PAGE_TYPE_2M 

2m page aka hugepage

MEMORY_PAGING_PAGE_TYPE_1G 

1g page aka big hugepage

MEMORY_PAGING_PAGE_TYPE_READONLY 

read only

MEMORY_PAGING_PAGE_TYPE_NOEXEC 

no executable

MEMORY_PAGING_PAGE_TYPE_USER_ACCESSIBLE 

no executable

MEMORY_PAGING_PAGE_TYPE_WRITE_THROUGH 

write through

MEMORY_PAGING_PAGE_TYPE_DISABLE_CACHE 

no cache

MEMORY_PAGING_PAGE_TYPE_GLOBAL 

global

MEMORY_PAGING_PAGE_TYPE_INTERNAL 

no executable

MEMORY_PAGING_PAGE_TYPE_WILL_DELETED 

no executable

Function Documentation

◆ memory_paging_add_page_ext()

int8_t memory_paging_add_page_ext ( memory_page_table_context_t * p4,
uint64_t virtual_address,
uint64_t frame_address,
memory_paging_page_type_t type )

creates virtual address frame mapping with adding page

Parameters
heapthe heap where variables will be created in
p4p4 page table
virtual_addressvirtual start address of page
frame_addressframe address of page links
typepage type, see also memory_paging_page_type_t
Returns
0 if successed

if heap is NULL, the pages created in default heap

◆ memory_paging_switch_table()

memory_page_table_context_t * memory_paging_switch_table ( const memory_page_table_context_t * new_table)

switches p4 page table

Parameters
[in]new_tablenew p4 table
Returns
old p4 table

change value of cr3 register. if new_table is NULL returns only current table