Fixed structs for PDEs and PTEs, got Qemu now properly maps virtual addresses to physical addresses, still triple faults on but I'm getting closer to getting it fixed.

This commit is contained in:
Xnoe 2021-10-11 14:02:04 +01:00
parent 65b8e7773e
commit 6328062d4f
Signed by: xnoe
GPG Key ID: 45AC398F44F0DAFE
4 changed files with 38 additions and 32 deletions

View File

@ -126,13 +126,13 @@ void main() {
printf("Stage2 success!\n");
asm ("mov %0, %%eax;"
"mov %%eax, %%cr3" : : "m" (kernel_page_directory));
//while (1);
asm ("mov %cr0, %eax;"
"or $0x80000001, %eax;"
"mov %eax, %cr0");
asm volatile("mov %0, %%eax;"
"mov %%eax, %%cr3;"
"mov %%cr0, %%eax;"
"or $0x80000000, %%eax;"
"mov %%eax, %%cr0" : : "m" (kernel_page_directory));
while (1);
((void(*)(void))0xc0000000)();
}

View File

@ -7,6 +7,7 @@
#include "atapio.h"
int main() {
while (1);
init_idt();
init_term();

View File

@ -1,11 +1,16 @@
#include "paging.h"
void map_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_directory, PTE** page_tables) {
uint32_t pd_index = (virtual & (1023 << 20)) >> 20;
uint32_t pt_index = (virtual & (1023 << 10)) >> 10;
typedef struct {
uint32_t page_offset : 12;
uint32_t pt_index : 10;
uint32_t pd_index : 10;
}__attribute__((packed)) split_addr;
page_directory[pd_index] = (PDE){
.address = (uint32_t)(page_tables[pd_index]) >> 12,
void map_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_directory, PTE** page_tables) {
split_addr* split = (split_addr*)&virtual;
page_directory[split->pd_index] = (PDE){
.address = (uint32_t)(page_tables[split->pd_index]) >> 12,
.available = 0,
.page_4mb = 0,
.accessed = 0,
@ -19,7 +24,7 @@ void map_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_director
.ignored2 = 0
};
page_tables[pd_index][pt_index] = (PTE){
page_tables[split->pd_index][split->pt_index] = (PTE){
.address = physical >> 12,
.available = 0,
.global = 0,

View File

@ -5,31 +5,31 @@
#include "types.h"
typedef struct {
uint32_t address : 20;
uint32_t available : 3;
uint32_t ignored : 1;
uint32_t page_4mb : 1;
uint32_t ignored2 : 1;
uint32_t accessed : 1;
uint32_t disable_cache : 1;
uint32_t write_through_cache : 1;
uint32_t privilege : 1;
uint32_t read_write : 1;
uint32_t present : 1;
uint32_t read_write : 1;
uint32_t privilege : 1;
uint32_t write_through_cache : 1;
uint32_t disable_cache : 1;
uint32_t accessed : 1;
uint32_t ignored2 : 1;
uint32_t page_4mb : 1;
uint32_t ignored : 1;
uint32_t available : 3;
uint32_t address : 20;
}__attribute__((packed)) PDE;
typedef struct {
uint32_t address : 20;
uint32_t available : 3;
uint32_t global : 1;
uint32_t ignored : 1;
uint32_t dirty : 1;
uint32_t accessed : 1;
uint32_t disable_cache : 1;
uint32_t write_through_cache : 1;
uint32_t privilege : 1;
uint32_t read_write : 1;
uint32_t present : 1;
uint32_t read_write : 1;
uint32_t privilege : 1;
uint32_t write_through_cache : 1;
uint32_t disable_cache : 1;
uint32_t accessed : 1;
uint32_t dirty : 1;
uint32_t ignored : 1;
uint32_t global : 1;
uint32_t available : 3;
uint32_t address : 20;
}__attribute__((packed)) PTE;
void map_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_directory, PTE** page_tables);