UnnamedOS
vmm.h
Go to the documentation of this file.
1 
7 #ifndef MEM_VMM_H
8 #define MEM_VMM_H
9 
10 #include <stdint.h>
11 #include <mem/pmm.h>
12 
14 #define VMM_PAGEDIR ((page_directory_t*) 0xFFFFF000)
15 #define VMM_PAGETAB(i) ((page_table_t*) (0xFFC00000 + (i) * PAGE_SIZE))
17 
20 typedef enum {
21  VMM_KERNEL = 0b0, VMM_USER = 0b1, VMM_WRITABLE = 0b100
22 } vmm_flags_t;
23 
25 typedef struct {
26  uint8_t pr : 1;
27  uint8_t rw : 1;
28  uint8_t user : 1;
29  uint8_t wt : 1;
30  uint8_t cache : 1;
31  uint8_t ac : 1;
32  uint8_t : 1;
33  uint8_t sz : 1;
34  uint8_t : 4;
35  uint32_t pt : 20;
36 } __attribute__((packed)) page_directory_entry_t;
37 
39 typedef struct {
40  uint8_t pr : 1;
41  uint8_t rw : 1;
42  uint8_t user : 1;
43  uint8_t wt : 1;
44  uint8_t cache : 1;
45  uint8_t ac : 1;
46  uint8_t dirty : 1;
47  uint8_t : 1;
48  uint8_t gl : 1;
49  uint8_t : 3;
50  uint32_t page : 20;
51 } __attribute__((packed)) page_table_entry_t;
52 
56 typedef page_table_entry_t page_table_t;
57 
58 page_directory_t* vmm_create_page_directory();
59 void vmm_destroy_page_directory(page_directory_t* dir_phys);
60 page_directory_t* vmm_load_page_directory(page_directory_t* new_directory);
61 void vmm_modify_page_directory(page_directory_t* new_directory);
63 uint8_t vmm_map(void* _vaddr, void* paddr, vmm_flags_t flags);
64 void vmm_unmap(void* _vaddr);
65 void vmm_map_range(void* vaddr, void* paddr, size_t len, vmm_flags_t flags);
66 void vmm_unmap_range(void* vaddr, size_t len);
67 void* vmm_get_physical_address(void* _vaddr);
68 void vmm_dump();
69 void* vmm_map_physical_memory(void* paddr, size_t len, vmm_flags_t flags);
70 void vmm_unmap_physical_memory(void* vaddr, size_t len);
71 void vmm_use(void* vaddr, void* paddr, size_t len, vmm_flags_t flags);
72 void* vmm_use_physical_memory(void* paddr, size_t len, vmm_flags_t flags);
73 void* vmm_use_virtual_memory(void* vaddr, size_t len, vmm_flags_t flags);
74 void* vmm_alloc(size_t len, vmm_flags_t flags);
75 void vmm_free(void* ptr, size_t len);
76 void vmm_enable_domain_check(uint8_t enable);
77 void vmm_init();
78 
79 #endif
80 
page_directory_t * vmm_create_page_directory()
Creates an empty page directory.
Definition: vmm.c:72
void * vmm_use_virtual_memory(void *vaddr, size_t len, vmm_flags_t flags)
Marks some page(s) as used and maps them into memory.
Definition: vmm.c:496
void vmm_enable_domain_check(uint8_t enable)
Enables or disables domain checking.
Definition: vmm.c:539
void vmm_unmap_range(void *vaddr, size_t len)
Unmaps the given page(s) from memory.
Definition: vmm.c:352
void vmm_modified_page_directory()
Ends a page directory modification.
Definition: vmm.c:164
void * vmm_alloc(size_t len, vmm_flags_t flags)
Marks some page(s) as used and maps them somewhere into memory.
Definition: vmm.c:511
void vmm_map_range(void *vaddr, void *paddr, size_t len, vmm_flags_t flags)
Maps the given page(s) into memory.
Definition: vmm.c:341
An entry in a page table.
Definition: vmm.h:39
void * vmm_map_physical_memory(void *paddr, size_t len, vmm_flags_t flags)
If necessary, maps the given page(s) somewhere into memory.
Definition: vmm.c:440
page_directory_t * vmm_load_page_directory(page_directory_t *new_directory)
Loads a new page directory.
Definition: vmm.c:129
void vmm_unmap(void *_vaddr)
Unmaps the given page from memory.
Definition: vmm.c:286
void vmm_init()
Initializes the VMM.
Definition: vmm.c:544
vmm_flags_t
Whether we are working with kernel or user memory.
Definition: vmm.h:20
void vmm_free(void *vaddr, size_t len)
Frees the given page(s) and unmaps them from memory.
Definition: vmm.c:528
void vmm_use(void *vaddr, void *paddr, size_t len, vmm_flags_t flags)
Marks the given page(s) as used and maps them into memory.
Definition: vmm.c:468
void vmm_destroy_page_directory(page_directory_t *dir_phys)
Destroys a page directory.
Definition: vmm.c:90
An entry in a page directory.
Definition: vmm.h:25
void * vmm_get_physical_address(void *_vaddr)
Translates a virtual address into a physical address.
Definition: vmm.c:362
void vmm_unmap_physical_memory(void *vaddr, size_t len)
If necessary, unmaps the given page(s) from memory.
Definition: vmm.c:456
uint8_t vmm_map(void *_vaddr, void *paddr, vmm_flags_t flags)
Maps the given page into memory.
Definition: vmm.c:253
void vmm_modify_page_directory(page_directory_t *new_directory)
Loads a page directory for temporary modification.
Definition: vmm.c:149
void vmm_dump()
Dumps the current page directory.
Definition: vmm.c:378
void * vmm_use_physical_memory(void *paddr, size_t len, vmm_flags_t flags)
Marks the given page(s) as used and maps them somewhere into memory.
Definition: vmm.c:481