Quick fixes, just changing order and makes a reference to the newly mapped higher-half page-directory
This commit is contained in:
parent
0cd287d4bd
commit
e41b764ac6
|
|
@ -34,12 +34,9 @@ extern const size_t _kernel_end;
|
|||
|
||||
struct PageDirectoryEntry _page_directory[1024] __attribute__((aligned(4096))); // Create a page directory with 1024 entries and make sure it's 4 KiB aligned
|
||||
|
||||
// Identity page table for lowest 4 MiB, including this
|
||||
// Identity page table for lowest 4 MiB, including this. This will be the table where the (current) kernel will be stored
|
||||
struct PageTableEntry _identity_page_table[1024] __attribute__((aligned(4096)));
|
||||
|
||||
// Assumes kernel is smaller than 4 MiB, should change later
|
||||
struct PageTableEntry _kernel_page_table[1024] __attribute__((aligned(4096)));
|
||||
|
||||
void initialize_pages() {
|
||||
struct PageDirectoryEntry identity_pd_entry = {
|
||||
.page_table_address = (size_t)(_identity_page_table) >> 12,
|
||||
|
|
@ -50,6 +47,7 @@ void initialize_pages() {
|
|||
};
|
||||
|
||||
_page_directory[0] = identity_pd_entry;
|
||||
_page_directory[768] = identity_pd_entry;
|
||||
|
||||
// Identity page lowest 4 MiB to not crash instantly
|
||||
for (size_t i = 0; i < mib(4) / kib(4); i++) {
|
||||
|
|
@ -62,8 +60,6 @@ void initialize_pages() {
|
|||
_identity_page_table[i] = table_entry;
|
||||
}
|
||||
|
||||
_page_directory[768] = identity_pd_entry;
|
||||
|
||||
asm("mov %0, %%cr3" :: "r" (_page_directory));
|
||||
uint32_t control_register_0;
|
||||
asm("mov %%cr0, %0" : "=r" (control_register_0));
|
||||
|
|
|
|||
|
|
@ -27,32 +27,38 @@
|
|||
Page pages[NUM_PAGES];
|
||||
|
||||
struct PageDirectoryEntry {
|
||||
uint32_t page_table_address : 20;
|
||||
uint32_t available_1 : 4;
|
||||
bool size : 1;
|
||||
bool available_2 : 1;
|
||||
bool accessed : 1;
|
||||
bool cache_disabled : 1;
|
||||
bool write_through : 1;
|
||||
bool user : 1;
|
||||
bool write : 1;
|
||||
bool present : 1;
|
||||
bool write : 1;
|
||||
bool user : 1;
|
||||
bool write_through : 1;
|
||||
bool cache_disabled : 1;
|
||||
bool accessed : 1;
|
||||
bool available_2 : 1;
|
||||
bool size : 1;
|
||||
size_t available_1 : 4;
|
||||
size_t page_table_address : 20;
|
||||
} __attribute__((packed)); // Force the compiler to keep our structure intact.
|
||||
|
||||
struct PageTableEntry {
|
||||
uint32_t physical_address : 20;
|
||||
uint32_t available : 3;
|
||||
bool global : 1;
|
||||
bool pat : 1;
|
||||
bool dirty : 1;
|
||||
bool accessed : 1;
|
||||
bool cache_disabled : 1;
|
||||
bool write_through : 1;
|
||||
bool user : 1;
|
||||
bool write : 1;
|
||||
bool present : 1;
|
||||
bool write : 1;
|
||||
bool user : 1;
|
||||
bool write_through : 1;
|
||||
bool cache_disabled : 1;
|
||||
bool accessed : 1;
|
||||
bool dirty : 1;
|
||||
bool pat : 1;
|
||||
bool global : 1;
|
||||
size_t available : 3;
|
||||
size_t physical_address : 20;
|
||||
} __attribute__((packed));
|
||||
|
||||
extern "C" PageDirectoryEntry _page_directory[1024];
|
||||
extern "C" PageTableEntry _identity_page_table[1024];
|
||||
|
||||
PageDirectoryEntry* page_directory;
|
||||
PageTableEntry* identity_page_table;
|
||||
PageTableEntry* kernel_page_table;
|
||||
PageDirectoryEntry dynamic_page_table[1024] __attribute__((aligned(4096))); // Create a page directory with 1024 entries and make sure it's 4 KiB aligned
|
||||
|
||||
Page::Page() { }
|
||||
|
|
@ -112,9 +118,9 @@ size_t Page::pt_entry() {
|
|||
|
||||
void Page::initialize() {
|
||||
// Allocate the lowest 1 MiB of both virtual and physical memory to BIOS
|
||||
for (size_t i = 0; i < mib(1); i += kib(4)) {
|
||||
Page::alloc_fixed((void*)i, (void*)i);
|
||||
}
|
||||
|
||||
page_directory = (struct PageDirectoryEntry*)((size_t)(_page_directory) + 0xC0000000);
|
||||
identity_page_table = (struct PageTableEntry*)((size_t)(_identity_page_table) + 0xC0000000);
|
||||
|
||||
/* for (size_t index = _kernel_start; index + kib(4) < _kernel_end; index += kib(4)) {
|
||||
Page::alloc_fixed(void *physical_address, void *virtual_addr)
|
||||
|
|
|
|||
Loading…
Reference in a new issue