diff --git a/src/boot_stage2/main.c b/src/boot_stage2/main.c index 6363ff7..2dbc016 100644 --- a/src/boot_stage2/main.c +++ b/src/boot_stage2/main.c @@ -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)(); } \ No newline at end of file diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index b835eb1..46dbc51 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -7,6 +7,7 @@ #include "atapio.h" int main() { + while (1); init_idt(); init_term(); diff --git a/src/kernel/paging.c b/src/kernel/paging.c index 24a884c..63978d3 100644 --- a/src/kernel/paging.c +++ b/src/kernel/paging.c @@ -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, diff --git a/src/kernel/paging.h b/src/kernel/paging.h index 5bcff4f..1978218 100644 --- a/src/kernel/paging.h +++ b/src/kernel/paging.h @@ -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);