feat: vmm; solved rectest() issue
This commit is contained in:
@@ -1,19 +1,22 @@
|
||||
#ifndef PMM_H
|
||||
#define PMM_H
|
||||
|
||||
#include "types.h"
|
||||
#include "../common/bootinfo.h"
|
||||
|
||||
#define PAGE_SIZE 4096
|
||||
#define BLOCKS_PER_BYTE 8
|
||||
|
||||
#define SAFE_SPACE_START_ADDR 0x100000
|
||||
|
||||
#define BITMAP_BYTE_INDEX(addr) ((addr / PAGE_SIZE) / BLOCKS_PER_BYTE)
|
||||
#define BITMAP_BIT_OFFSET(addr) ((addr / PAGE_SIZE) % BLOCKS_PER_BYTE)
|
||||
#define BITMAP_TEST(bitmap, addr) (bitmap[BITMAP_BYTE_INDEX(addr)] & (1 << BITMAP_BIT_OFFSET(addr)))
|
||||
#define BITMAP_SET(bitmap, addr) (bitmap[BITMAP_BYTE_INDEX(addr)] |= (1 << BITMAP_BIT_OFFSET(addr)))
|
||||
#define BITMAP_UNSET(bitmap, addr) (bitmap[BITMAP_BYTE_INDEX(addr)] &= ~(1 << BITMAP_BIT_OFFSET(addr)))
|
||||
|
||||
void pmm_init(BI_MemoryMap mmap);
|
||||
u8* get_bitmap();
|
||||
void pmm_init(BI_MemoryMap mmap);
|
||||
void* pmm_alloc_page();
|
||||
void pmm_free_page(void* addr);
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
#ifndef VMM_H
|
||||
#define VMM_H
|
||||
|
||||
#include "../common/bootinfo.h"
|
||||
#include "types.h"
|
||||
|
||||
#define PTE_PRESENT (1ULL << 0) // 0 -- not present: page fault when trying to access; 1 -- present, can RW
|
||||
#define PTE_RW (1ULL << 1) // 0 -- RO: page fault trying to write; 1 -- RW
|
||||
#define PTE_USER (1ULL << 2) // 0 -- Ring 0: R3 get segfault gtrying to access; 1 -- Ring 3
|
||||
#define PTE_PWT (1ULL << 3) // 1 -- skip L1/L2 cache when writing to RAM
|
||||
#define PTE_PCD (1ULL << 4) // 1 -- cache disabled for page
|
||||
#define PTE_ACCESSED (1ULL << 5) // CPU sets it (by itself) to 1 when RW this page
|
||||
#define PTE_DIRTY (1ULL << 6) // CPU sets it when writing to this page
|
||||
#define PTE_NX (1ULL << 63) // No execute
|
||||
|
||||
|
||||
#define PTE_ADDR_MASK 0x000FFFFFFFFFF000 // mask to get clean physical addres that located at bits 12-51
|
||||
|
||||
#define PTE_GET_ADDR(entry) ((entry) & PTE_ADDR_MASK) // get physical address
|
||||
#define PTE_GET_FLAGS(entry) ((entry) & ~PTE_ADDR_MASK) // get flags
|
||||
|
||||
|
||||
#define VMM_PT_INDEX(virt) (((virt) >> 12) & 0x1FF) // Table Index (bits 12-20)
|
||||
#define VMM_PD_INDEX(virt) (((virt) >> 21) & 0x1FF) // Page Directory Index (bits 21-29)
|
||||
#define VMM_PDPT_INDEX(virt) (((virt) >> 30) & 0x1FF) // PDPT Index (bits 30-38)
|
||||
#define VMM_PML4_INDEX(virt) (((virt) >> 39) & 0x1FF) // PML4 Index (bits 39-47): main page
|
||||
|
||||
void vmm_init(Bootinfo* info);
|
||||
void vmm_map_page(u64* pml4, u64 phys, u64 virt, u64 flags);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user