KernOS
virtualmemory.cpp
Go to the documentation of this file.
1 //
2 // Created on 6/1/20.
3 //
4 
5 #include <virtualmemory.h>
6 #include <registers.h>
7 
8 void *kpagetable; // populated in boot.S
9 
12 namespace VM // virtual memory
13 {
14  const size_t PD_SIZE = 1024;
15  const size_t PT_SIZE = 1024;
16  const size_t PG_SIZE = 4096;
17 
18  uint32_t page_directory[PD_SIZE][[gnu::aligned(PG_SIZE)]];
19  uint32_t pagetable0 [PT_SIZE][[gnu::aligned(PG_SIZE)]];
20 
21  void InitializePageDirectory(uint32_t PageDirectory[PD_SIZE])
22  {
23  for (size_t i = 0; i < PD_SIZE; ++i)
24  {
25  PageDirectory[i] = DWord<PDA::R>();
26  }
27  }
28 
34  void MapPageTable(const size_t Idx, uint32_t PageDirectory[PD_SIZE], uint32_t PageTable[PT_SIZE])
35  {
36  for (size_t i = 0; i < PT_SIZE; ++i)
37  {
38  PageTable[i] = (i * PG_SIZE)
39  | (DWord<PTA::R>() | DWord<PTA::P>());
40  }
41 
42  PageDirectory[Idx] = ( (uint32_t) PageTable
43  | (DWord<PDA::R>() | DWord<PDA::P>())
44  );
45  }
46 
50  void InstallPaging(const uint32_t PageDirectory[])
51  {
52  asm volatile
53  (
54  "mov %0, %%cr3\n"
55  :
56  : "a"(PageDirectory)
57  );
58 
59  asm volatile
60  (
61  "mov %%cr0, %%eax\n"
62  "or %0, %%eax\n"
63  "mov %%eax, %%cr0"
64  :
65  : "n"(DWord<CR0::PG>())
66  : "eax"
67  );
68  }
69 }
70 
71 namespace INIT
72 {
76  void PAGE()
77  {
81  }
82 } // namespace INIT
void MapPageTable(const size_t Idx, uint32_t PageDirectory[PD_SIZE], uint32_t PageTable[PT_SIZE])
Map page table.
const size_t PT_SIZE
page table size
void InitializePageDirectory(uint32_t PageDirectory[PD_SIZE])
uint32_t page_directory[PD_SIZE][[gnu::aligned(PG_SIZE)]]
const size_t PD_SIZE
page directory size
contains all kernel initialization routines
Definition: cpu.h:10
void * kpagetable
Virtual memory namespace.
Definition: virtualmemory.h:16
void InstallPaging(const uint32_t PageDirectory[])
Set cr3 to page directory, and turn on paging.
const size_t PG_SIZE
page size
uint32_t pagetable0[PT_SIZE][[gnu::aligned(PG_SIZE)]]
void PAGE()
set up page directory, page table, and turn on paging