From edf9e71e2a7b6b89775c29cf28c19c6b89992c25 Mon Sep 17 00:00:00 2001 From: aqua Date: Mon, 28 Mar 2022 20:03:38 +0300 Subject: Initial commit x86 kernel that prints a hello world message to com1 --- src/mem/vmm.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/mem/vmm.c (limited to 'src/mem') diff --git a/src/mem/vmm.c b/src/mem/vmm.c new file mode 100644 index 0000000..431f0df --- /dev/null +++ b/src/mem/vmm.c @@ -0,0 +1,49 @@ +#include "../mem.h" +#include "paging.h" + +extern struct DirectoryEntry k_pagedir[1024]; +extern struct TableEntry k_ptable0x300[1024]; + +extern const unsigned MULTIBOOT_SIZE; +extern const unsigned VADDR_BASE; + +unsigned +to_vaddr(unsigned paddr) +{ + return paddr + (unsigned)&VADDR_BASE - (unsigned)&MULTIBOOT_SIZE; +} + +unsigned int +vmm_map(unsigned int paddr, unsigned int vaddr) +{ + if (paddr & 0xfff || vaddr & 0xfff) return 0; + + const unsigned table_idx = vaddr >> 22; // high 10 bits + const unsigned entry_idx = (vaddr >> 12) & 0x3ff; // low 10 bits + + if (k_pagedir[table_idx].present == 0) return 0; + struct TableEntry *table = (struct TableEntry *)to_vaddr(k_pagedir[table_idx].address << 12); + + table[entry_idx].address = paddr >> 12; + table[entry_idx].present = 1; + table[entry_idx].writeable = 1; + + return vaddr; +} + +void +alloc4M() +{ + // enable pse in cr4 + asm volatile(R"( + movl %cr4, %eax + orl $0x10, %eax + movl %eax, %cr4 +)"); + + struct DirectoryEntry4MB *directory = (struct DirectoryEntry4MB *)&k_pagedir[0x301]; + directory->address_low = 0x1; + directory->present = 1; + directory->writeable = 1; + directory->pagesize = 1; +} -- cgit v1.2.1