Espresso 0.0.0e
This commit is contained in:
		| @ -3,6 +3,7 @@ | ||||
|  | ||||
| #include <mm/paging.h> | ||||
| #include <mm/pmm.h> | ||||
| #include <mm/heap.h> | ||||
|  | ||||
| #define PAGE_DIRECTORY_ENTRIES 1024 | ||||
| #define PAGE_TABLE_ENTRIES     1024 | ||||
| @ -11,7 +12,7 @@ | ||||
| typedef uint32_t page_directory_entry_t; | ||||
| typedef uint32_t page_table_entry_t; | ||||
|  | ||||
| static page_directory_entry_t* page_directory = (page_directory_entry_t*)0x9C000; /* Must be page-aligned */ | ||||
| static page_directory_entry_t* page_directory = NULL; /* Will be allocated */ | ||||
| static page_table_entry_t* page_tables[PAGE_DIRECTORY_ENTRIES]; | ||||
|  | ||||
| extern void _enable_paging_asm(void); | ||||
| @ -19,37 +20,37 @@ extern void _enable_paging_asm(void); | ||||
| void paging_init(void) | ||||
| { | ||||
|   /* Allocate and clear the page directory */ | ||||
|   page_directory = (uint32_t*)alloc_page(); | ||||
|   memset(page_directory, 0, 4096); | ||||
|   page_directory = (page_directory_entry_t*)alloc_page(); | ||||
|   memset(page_directory, 0, PAGE_SIZE); | ||||
|  | ||||
|   /* Allocate and set up the first identity-mapped page table (0–4MB) */ | ||||
|   uint32_t* first_table = (uint32_t*)alloc_page(); | ||||
|   memset(first_table, 0, 4096); | ||||
|   for (uint32_t i = 0; i < 1024; i++) | ||||
|   page_tables[0] = (page_table_entry_t*)alloc_page(); | ||||
|   memset(page_tables[0], 0, PAGE_SIZE); | ||||
|   for (uint32_t i = 0; i < PAGE_TABLE_ENTRIES; i++) | ||||
|   { | ||||
|     first_table[i] = (i * 0x1000) | 3; /* Present | RW */ | ||||
|     page_tables[0][i] = (i * PAGE_SIZE) | 3; /* Present | RW */ | ||||
|   } | ||||
|   page_directory[0] = ((uint32_t)first_table) | 3; | ||||
|   page_directory[0] = ((uint32_t)page_tables[0]) | 3; | ||||
|  | ||||
|   /* --- Map 4MB heap at 0xC0000000 --- */ | ||||
|   uint32_t* heap_table = (uint32_t*)alloc_page(); | ||||
|   memset(heap_table, 0, 4096); | ||||
|  | ||||
|   for (uint32_t i = 0; i < 1024; i++) /* 256 pages = 1MB */ | ||||
|   /* Allocate and clear the heap page table */ | ||||
|   uint32_t heap_pd_index = HEAP_START >> 22;  /* 0xC0000000 >> 22 = 768 */ | ||||
|   page_tables[heap_pd_index] = (page_table_entry_t*)alloc_page(); | ||||
|   memset(page_tables[heap_pd_index], 0, PAGE_SIZE); | ||||
|    | ||||
|   /* Map 4MB heap pages */ | ||||
|   for (uint32_t i = 0; i < PAGE_TABLE_ENTRIES; i++) /* 1024 pages = 4MB */ | ||||
|   { | ||||
|     uint32_t phys = (uint32_t)alloc_page(); | ||||
|     void* phys = alloc_page(); | ||||
|     if (phys == 0) | ||||
|     { | ||||
|       printf("Out of physical memory during heap mapping!\n"); | ||||
|       while (1); | ||||
|     } | ||||
|     heap_table[i] = phys | 3; /* Present | RW */ | ||||
|     page_tables[heap_pd_index][i] = ((uint32_t)phys & 0xFFFFF000) | 3; /* Present | RW */ | ||||
|   } | ||||
|   page_directory[heap_pd_index] = ((uint32_t)page_tables[heap_pd_index]) | 3; | ||||
|  | ||||
|   /* 0xC0000000 >> 22 == 768 */ | ||||
|   page_directory[768] = ((uint32_t)heap_table) | 3; | ||||
|  | ||||
|   // Load page directory | ||||
|   /* Load page directory */ | ||||
|   asm volatile ("mov %0, %%cr3" : : "r"(page_directory)); | ||||
|  | ||||
|   /* Enable paging */ | ||||
| @ -67,16 +68,14 @@ void map_page(void* phys_addr, void* virt_addr) | ||||
|     void* pt_phys = alloc_page(); | ||||
|     page_tables[pd_index] = (page_table_entry_t*)((uint32_t)pt_phys + 0xC0000000); /* Map it higher */ | ||||
|      | ||||
|     for (int i = 0; i < PAGE_TABLE_ENTRIES; i++) | ||||
|     { | ||||
|       page_tables[pd_index][i] = 0x00000002; /* Not present */ | ||||
|     } | ||||
|     memset(page_tables[pd_index], 0, PAGE_SIZE); | ||||
|      | ||||
|     page_directory[pd_index] = ((uint32_t)pt_phys) | 0x3; /* Present, R/W */ | ||||
|   } | ||||
|  | ||||
|   page_table_entry_t* page_table = (page_table_entry_t*)((page_directory[pd_index] & 0xFFFFF000) | 0xC0000000); | ||||
|   page_table_entry_t* page_table = (page_table_entry_t*)((page_directory[pd_index] & 0xFFFFF000) + 0xC0000000); | ||||
|   page_table[pt_index] = ((uint32_t)phys_addr & 0xFFFFF000) | 0x3; /* Present, R/W */ | ||||
|  | ||||
|   asm volatile ("invlpg (%0)" :: "r" (virt_addr) : "memory"); | ||||
| } | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user