[Krafton Jungle] PintOS 2.0.0
크래프톤 정글 PintOS
 
Loading...
Searching...
No Matches
mmu.h File Reference
#include <stdbool.h>
#include <stdint.h>
#include "threads/pte.h"
Include dependency graph for mmu.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  desc_ptr
 

Macros

#define is_writable(pte)   (*(pte) & PTE_W)
 
#define is_user_pte(pte)   (*(pte) & PTE_U)
 
#define is_kern_pte(pte)   (!is_user_pte (pte))
 
#define pte_get_paddr(pte)   (pg_round_down(*(pte)))
 

Typedefs

typedef bool pte_for_each_func(uint64_t *pte, void *va, void *aux)
 

Functions

uint64_tpml4e_walk (uint64_t *pml4, const uint64_t va, int create)
 
uint64_tpml4_create (void)
 
bool pml4_for_each (uint64_t *, pte_for_each_func *, void *)
 
void pml4_destroy (uint64_t *pml4)
 
void pml4_activate (uint64_t *pml4)
 
void * pml4_get_page (uint64_t *pml4, const void *upage)
 
bool pml4_set_page (uint64_t *pml4, void *upage, void *kpage, bool rw)
 
void pml4_clear_page (uint64_t *pml4, void *upage)
 
bool pml4_is_dirty (uint64_t *pml4, const void *upage)
 
void pml4_set_dirty (uint64_t *pml4, const void *upage, bool dirty)
 
bool pml4_is_accessed (uint64_t *pml4, const void *upage)
 
void pml4_set_accessed (uint64_t *pml4, const void *upage, bool accessed)
 
struct desc_ptr __attribute__ ((packed))
 

Variables

uint16_t size
 
uint64_t address
 

Macro Definition Documentation

◆ is_kern_pte

#define is_kern_pte (   pte)    (!is_user_pte (pte))

◆ is_user_pte

#define is_user_pte (   pte)    (*(pte) & PTE_U)

◆ is_writable

#define is_writable (   pte)    (*(pte) & PTE_W)

◆ pte_get_paddr

#define pte_get_paddr (   pte)    (pg_round_down(*(pte)))

Typedef Documentation

◆ pte_for_each_func

typedef bool pte_for_each_func(uint64_t *pte, void *va, void *aux)

Function Documentation

◆ __attribute__()

struct desc_ptr __attribute__ ( (packed)  )

◆ pml4_activate()

void pml4_activate ( uint64_t pml4)
205 {
206 lcr3 (vtop (pml4 ? pml4 : base_pml4));
207}
uint64_t * base_pml4
Definition: init.c:42
#define vtop(vaddr)
Definition: vaddr.h:53
Here is the caller graph for this function:

◆ pml4_clear_page()

void pml4_clear_page ( uint64_t pml4,
void *  upage 
)
258 {
259 uint64_t *pte;
260 ASSERT (pg_ofs (upage) == 0);
261 ASSERT (is_user_vaddr (upage));
262
263 pte = pml4e_walk (pml4, (uint64_t) upage, false);
264
265 if (pte != NULL && (*pte & PTE_P) != 0) {
266 *pte &= ~PTE_P;
267 if (rcr3 () == vtop (pml4))
268 invlpg ((uint64_t) upage);
269 }
270}
#define ASSERT(CONDITION)
Definition: debug.h:30
uint64_t * pml4e_walk(uint64_t *pml4e, const uint64_t va, int create)
Definition: mmu.c:65
#define PTE_P
Definition: pte.h:39
#define NULL
Definition: stddef.h:4
unsigned long long int uint64_t
Definition: stdint.h:29
#define is_user_vaddr(vaddr)
Definition: vaddr.h:41
#define pg_ofs(va)
Definition: vaddr.h:24
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pml4_create()

uint64_t * pml4_create ( void  )
96 {
97 uint64_t *pml4 = palloc_get_page (0);
98 if (pml4)
99 memcpy (pml4, base_pml4, PGSIZE);
100 return pml4;
101}
void * palloc_get_page(enum palloc_flags)
Definition: palloc.c:301
void * memcpy(void *, const void *, size_t)
Definition: string.c:7
#define PGSIZE
Definition: vaddr.h:20
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pml4_destroy()

void pml4_destroy ( uint64_t pml4)
190 {
191 if (pml4 == NULL)
192 return;
193 ASSERT (pml4 != base_pml4);
194
195 /* if PML4 (vaddr) >= 1, it's kernel space by define. */
196 uint64_t *pdpe = ptov ((uint64_t *) pml4[0]);
197 if (((uint64_t) pdpe) & PTE_P)
198 pdpe_destroy ((void *) PTE_ADDR (pdpe));
199 palloc_free_page ((void *) pml4);
200}
static void pdpe_destroy(uint64_t *pdpe)
Definition: mmu.c:179
void palloc_free_page(void *)
Definition: palloc.c:333
#define PTE_ADDR(pte)
Definition: pte.h:29
#define ptov(paddr)
Definition: vaddr.h:49
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pml4_for_each()

bool pml4_for_each ( uint64_t pml4,
pte_for_each_func func,
void *  aux 
)
148 {
149 for (unsigned i = 0; i < PGSIZE / sizeof(uint64_t *); i++) {
150 uint64_t *pdpe = ptov((uint64_t *) pml4[i]);
151 if (((uint64_t) pdpe) & PTE_P)
152 if (!pdp_for_each ((uint64_t *) PTE_ADDR (pdpe), func, aux, i))
153 return false;
154 }
155 return true;
156}
static bool pdp_for_each(uint64_t *pdp, pte_for_each_func *func, void *aux, unsigned pml4_index)
Definition: mmu.c:134
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pml4_get_page()

void * pml4_get_page ( uint64_t pml4,
const void *  upage 
)
214 {
215 ASSERT (is_user_vaddr (uaddr));
216
217 uint64_t *pte = pml4e_walk (pml4, (uint64_t) uaddr, 0);
218
219 if (pte && (*pte & PTE_P))
220 return ptov (PTE_ADDR (*pte)) + pg_ofs (uaddr);
221 return NULL;
222}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pml4_is_accessed()

bool pml4_is_accessed ( uint64_t pml4,
const void *  upage 
)
303 {
304 uint64_t *pte = pml4e_walk (pml4, (uint64_t) vpage, false);
305 return pte != NULL && (*pte & PTE_A) != 0;
306}
#define PTE_A
Definition: pte.h:42
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pml4_is_dirty()

bool pml4_is_dirty ( uint64_t pml4,
const void *  upage 
)
277 {
278 uint64_t *pte = pml4e_walk (pml4, (uint64_t) vpage, false);
279 return pte != NULL && (*pte & PTE_D) != 0;
280}
#define PTE_D
Definition: pte.h:43
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pml4_set_accessed()

void pml4_set_accessed ( uint64_t pml4,
const void *  upage,
bool  accessed 
)
311 {
312 uint64_t *pte = pml4e_walk (pml4, (uint64_t) vpage, false);
313 if (pte) {
314 if (accessed)
315 *pte |= PTE_A;
316 else
317 *pte &= ~(uint32_t) PTE_A;
318
319 if (rcr3 () == vtop (pml4))
320 invlpg ((uint64_t) vpage);
321 }
322}
unsigned int uint32_t
Definition: stdint.h:26
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pml4_set_dirty()

void pml4_set_dirty ( uint64_t pml4,
const void *  upage,
bool  dirty 
)
285 {
286 uint64_t *pte = pml4e_walk (pml4, (uint64_t) vpage, false);
287 if (pte) {
288 if (dirty)
289 *pte |= PTE_D;
290 else
291 *pte &= ~(uint32_t) PTE_D;
292
293 if (rcr3 () == vtop (pml4))
294 invlpg ((uint64_t) vpage);
295 }
296}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pml4_set_page()

bool pml4_set_page ( uint64_t pml4,
void *  upage,
void *  kpage,
bool  rw 
)
240 {
241 ASSERT (pg_ofs (upage) == 0);
242 ASSERT (pg_ofs (kpage) == 0);
243 ASSERT (is_user_vaddr (upage));
244 ASSERT (pml4 != base_pml4);
245
246 uint64_t *pte = pml4e_walk (pml4, (uint64_t) upage, 1);
247
248 if (pte)
249 *pte = vtop (kpage) | PTE_P | (rw ? PTE_W : 0) | PTE_U;
250 return pte != NULL;
251}
#define PTE_W
Definition: pte.h:40
#define PTE_U
Definition: pte.h:41
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pml4e_walk()

uint64_t * pml4e_walk ( uint64_t pml4,
const uint64_t  va,
int  create 
)
65 {
66 uint64_t *pte = NULL;
67 int idx = PML4 (va);
68 int allocated = 0;
69 if (pml4e) {
70 uint64_t *pdpe = (uint64_t *) pml4e[idx];
71 if (!((uint64_t) pdpe & PTE_P)) {
72 if (create) {
73 uint64_t *new_page = palloc_get_page (PAL_ZERO);
74 if (new_page) {
75 pml4e[idx] = vtop (new_page) | PTE_U | PTE_W | PTE_P;
76 allocated = 1;
77 } else
78 return NULL;
79 } else
80 return NULL;
81 }
82 pte = pdpe_walk (ptov (PTE_ADDR (pml4e[idx])), va, create);
83 }
84 if (pte == NULL && allocated) {
85 palloc_free_page ((void *) ptov (PTE_ADDR (pml4e[idx])));
86 pml4e[idx] = 0;
87 }
88 return pte;
89}
bool create(const char *file, unsigned initial_size)
파일을 생성하는 시스템 콜
Definition: syscall.c:233
static uint64_t * pdpe_walk(uint64_t *pdpe, const uint64_t va, int create)
Definition: mmu.c:32
@ PAL_ZERO
Definition: palloc.h:10
#define PML4(la)
Definition: pte.h:25
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ address

uint64_t address

◆ size

uint16_t size