[MEMORY] Memory pages and paging management
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
#ifdef __ASSEMBLER__
|
||||
#define V2P(a) ((a) - KERNEL_OFFSET)
|
||||
#define P2V(a) ((a) + KERNEL_OFFSET)
|
||||
#define PAGE_OFFSET(p) ((p) & 0xFFF)
|
||||
#define P1_OFFSET(p) (((p) >> 12) & 0x1FF)
|
||||
#define P2_OFFSET(p) (((p) >> 21) & 0x1FF)
|
||||
#define P3_OFFSET(p) (((p) >> 30) & 0x1FF)
|
||||
@@ -15,8 +16,15 @@
|
||||
#define P2V(a) ((void *)((uintptr_t)(a) + KERNEL_OFFSET))
|
||||
// returns an address n bytes after the target of pointer p
|
||||
#define incptr(p, n) ((void *)(((uintptr_t)(p)) + (n)))
|
||||
#define PAGE_OFFSET(p) (((uintptr_t)(p)) & 0xFFF)
|
||||
#define P1_OFFSET(p) ((((uintptr_t)(p)) >> 12) & 0x1FF)
|
||||
#define P2_OFFSET(p) ((((uintptr_t)(p)) >> 21) & 0x1FF)
|
||||
#define P3_OFFSET(p) ((((uintptr_t)(p)) >> 30) & 0x1FF)
|
||||
#define P4_OFFSET(p) ((((uintptr_t)(p)) >> 39) & 0x1FF)
|
||||
#endif
|
||||
|
||||
#define PAGE_SIZE 0x1000
|
||||
#define PAGE_FLAGS_MASK 0xFFF
|
||||
// Paging
|
||||
#define PAGE_PRESENT 0x001
|
||||
#define PAGE_WRITE 0x002
|
||||
@@ -27,3 +35,23 @@
|
||||
#define PAGE_DIRTY 0x040
|
||||
#define PAGE_HUGE 0x080
|
||||
#define PAGE_GLOBAL 0x100
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
typedef void * page_table;
|
||||
extern page_table BootP4;
|
||||
|
||||
extern int kernel_start, kernel_end;
|
||||
|
||||
void pmm_init();
|
||||
uintptr_t pmm_alloc();
|
||||
void pmm_free(uintptr_t page);
|
||||
|
||||
#define GET_P4() ((page_table)V2P(&BootP4))
|
||||
|
||||
void vmm_init();
|
||||
page_table *vmm_new_P4();
|
||||
void vmm_set_P4(page_table *P4);
|
||||
void vmm_free_P4(page_table *P4);
|
||||
uintptr_t vmm_get_page(page_table *P4, uintptr_t addr);
|
||||
uintptr_t vmm_set_page(page_table *P4, uintptr_t addr, uintptr_t phys, uint32_t flags);
|
||||
#endif
|
||||
|
||||
@@ -43,6 +43,15 @@
|
||||
uint32_t vbe_interface_len;
|
||||
} mboot1_info;
|
||||
|
||||
typedef struct {
|
||||
uint32_t size;
|
||||
uint32_t base_lo;
|
||||
uint32_t base_hi;
|
||||
uint32_t len_lo;
|
||||
uint32_t len_hi;
|
||||
uint32_t type;
|
||||
} mboot1_mmap_entry;
|
||||
|
||||
// MULTIBOOT 2
|
||||
|
||||
typedef struct {
|
||||
@@ -56,9 +65,21 @@
|
||||
char data[];
|
||||
} mboot2_tag_basic;
|
||||
|
||||
typedef struct {
|
||||
uint64_t base_addr;
|
||||
uint64_t length;
|
||||
uint32_t type;
|
||||
uint32_t reserved;
|
||||
} mboot2_mmap_entry;
|
||||
typedef struct {
|
||||
uint32_t entry_size;
|
||||
uint32_t entry_version;
|
||||
mboot2_mmap_entry entries[];
|
||||
} mboot2_memory_map;
|
||||
|
||||
#define MBOOT2_CMDLINE 1
|
||||
#define MBOOT2_BOOTLOADER 2
|
||||
#define MBOOT2_MMAP 6
|
||||
|
||||
// Multiboot tags are padded to a multiple of 8 bytes
|
||||
#define next_tag(tag) ((void *)((((uintptr_t)tag) + tag->size + 7) & ~0x7))
|
||||
@@ -69,9 +90,15 @@
|
||||
void *data;
|
||||
char *commandline;
|
||||
char *bootloader;
|
||||
void *mmap;
|
||||
uint32_t mmap_size;
|
||||
};
|
||||
extern struct mboot_data_st mboot_data;
|
||||
|
||||
#define MBOOT_MMAP_FREE 1
|
||||
|
||||
void multiboot_init(uint64_t magic, void *data);
|
||||
int multiboot_page_used(uintptr_t addr);
|
||||
int multiboot_get_memory_area(uintptr_t *start, uintptr_t *end, uint32_t *type);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -4,4 +4,5 @@ void load_idt(void *);
|
||||
uint64_t read_cr0();
|
||||
uint64_t read_cr2();
|
||||
uint64_t read_cr3();
|
||||
void write_cr3(uint64_t);
|
||||
uint64_t read_cr4();
|
||||
|
||||
Reference in New Issue
Block a user