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:
parent
65b8e7773e
commit
6328062d4f
@ -126,13 +126,13 @@ void main() {
|
|||||||
|
|
||||||
printf("Stage2 success!\n");
|
printf("Stage2 success!\n");
|
||||||
|
|
||||||
asm ("mov %0, %%eax;"
|
//while (1);
|
||||||
"mov %%eax, %%cr3" : : "m" (kernel_page_directory));
|
|
||||||
|
|
||||||
asm ("mov %cr0, %eax;"
|
asm volatile("mov %0, %%eax;"
|
||||||
"or $0x80000001, %eax;"
|
"mov %%eax, %%cr3;"
|
||||||
"mov %eax, %cr0");
|
"mov %%cr0, %%eax;"
|
||||||
|
"or $0x80000000, %%eax;"
|
||||||
|
"mov %%eax, %%cr0" : : "m" (kernel_page_directory));
|
||||||
|
|
||||||
while (1);
|
|
||||||
((void(*)(void))0xc0000000)();
|
((void(*)(void))0xc0000000)();
|
||||||
}
|
}
|
@ -7,6 +7,7 @@
|
|||||||
#include "atapio.h"
|
#include "atapio.h"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
while (1);
|
||||||
init_idt();
|
init_idt();
|
||||||
init_term();
|
init_term();
|
||||||
|
|
||||||
|
@ -1,11 +1,16 @@
|
|||||||
#include "paging.h"
|
#include "paging.h"
|
||||||
|
|
||||||
void map_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_directory, PTE** page_tables) {
|
typedef struct {
|
||||||
uint32_t pd_index = (virtual & (1023 << 20)) >> 20;
|
uint32_t page_offset : 12;
|
||||||
uint32_t pt_index = (virtual & (1023 << 10)) >> 10;
|
uint32_t pt_index : 10;
|
||||||
|
uint32_t pd_index : 10;
|
||||||
|
}__attribute__((packed)) split_addr;
|
||||||
|
|
||||||
page_directory[pd_index] = (PDE){
|
void map_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_directory, PTE** page_tables) {
|
||||||
.address = (uint32_t)(page_tables[pd_index]) >> 12,
|
split_addr* split = (split_addr*)&virtual;
|
||||||
|
|
||||||
|
page_directory[split->pd_index] = (PDE){
|
||||||
|
.address = (uint32_t)(page_tables[split->pd_index]) >> 12,
|
||||||
.available = 0,
|
.available = 0,
|
||||||
.page_4mb = 0,
|
.page_4mb = 0,
|
||||||
.accessed = 0,
|
.accessed = 0,
|
||||||
@ -19,7 +24,7 @@ void map_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_director
|
|||||||
.ignored2 = 0
|
.ignored2 = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
page_tables[pd_index][pt_index] = (PTE){
|
page_tables[split->pd_index][split->pt_index] = (PTE){
|
||||||
.address = physical >> 12,
|
.address = physical >> 12,
|
||||||
.available = 0,
|
.available = 0,
|
||||||
.global = 0,
|
.global = 0,
|
||||||
|
@ -5,31 +5,31 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
typedef struct {
|
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 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;
|
}__attribute__((packed)) PDE;
|
||||||
|
|
||||||
typedef struct {
|
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 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;
|
}__attribute__((packed)) PTE;
|
||||||
|
|
||||||
void map_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_directory, PTE** page_tables);
|
void map_4k_phys_to_virt(uint32_t physical, uint32_t virtual, PDE* page_directory, PTE** page_tables);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user