diff --git a/kernel/boot/boot.S b/kernel/boot/boot.S index 22605b0..9359c8e 100644 --- a/kernel/boot/boot.S +++ b/kernel/boot/boot.S @@ -10,6 +10,13 @@ .long FLAGS .long CHECKSUM +.section .bss +.align 4096 +boot_page_directory: + .skip 4096 +boot_page_table1: + .skip 4096 + .section .bss .align 16 stack_bottom: diff --git a/kernel/kmain.c b/kernel/kmain.c index a5c7d59..3555342 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -53,14 +53,12 @@ void kmain(uint32_t magic, multiboot_info* mbi) { uint32_t mem_size = total_free_memory(); kprintf("Total available memory: %d MB\n", mem_size / 1024 / 1024); - page = alloc_page(); - kprintf("Allocated page at: 0x%x\n", (uint32_t)page); + init_paging(); + enable_paging(); + kprintf("Paging enabled\n"); - free_page(page); - kprintf("Freed page"); - - enable_interrupts(); - kprintf("Interrupts enabled\n"); + // enable_interrupts(); + // kprintf("Interrupts enabled\n"); while(1); } diff --git a/kernel/linker.ld b/kernel/linker.ld index 007814f..b3bef26 100644 --- a/kernel/linker.ld +++ b/kernel/linker.ld @@ -2,7 +2,7 @@ ENTRY(_start) SECTIONS { - . = 2M; + . = 0xC0100000; __kernel_start = .; .text BLOCK(4K) : ALIGN(4K) diff --git a/kernel/memory/mm.c b/kernel/memory/mm.c index 66c3edd..71ba835 100644 --- a/kernel/memory/mm.c +++ b/kernel/memory/mm.c @@ -13,6 +13,8 @@ static uint32_t max_address = 0; static uint32_t total_available_memory = 0; static uint8_t memory_bitmap[BITMAP_SIZE]; +uint32_t* page_directory; + static void mark_free(uint32_t addr) { uint32_t page_index = addr / PAGE_SIZE; uint32_t byte_index = page_index / 8; @@ -111,4 +113,20 @@ void* alloc_page() { void free_page(void* addr) { mark_free((uint32_t)addr); +} + +void init_paging() { + page_directory = alloc_page(); + for (int i = 0; i < 1024; i++) { + page_directory[i] = 0x0; + } + + uint32_t* page_table = alloc_page(); + page_directory[0] = (uint32_t)(page_table) | 0x3; + for (int i = 0; i < 1024; i++) { + page_table[i] = (i * PAGE_SIZE) | 0x3; + } + + extern void load_page_directory(uint32_t* pd); + load_page_directory(page_directory); } \ No newline at end of file diff --git a/kernel/memory/mm.h b/kernel/memory/mm.h index d3e7427..2eb6646 100644 --- a/kernel/memory/mm.h +++ b/kernel/memory/mm.h @@ -13,4 +13,7 @@ uint32_t total_free_memory(); void* alloc_page(); void free_page(void* addr); -#endif \ No newline at end of file +void init_paging(); +void enable_paging(); + +#endif diff --git a/kernel/memory/mm_stubs.S b/kernel/memory/mm_stubs.S new file mode 100644 index 0000000..2016675 --- /dev/null +++ b/kernel/memory/mm_stubs.S @@ -0,0 +1,21 @@ +.code32 +.global load_page_directory +load_page_directory: + push %ebp + mov %esp, %ebp + + mov 8(%ebp), %eax + mov %eax, %cr3 + + leave + ret + +.global enable_paging +enable_paging: + mov %eax, %cr0 + orl $0x80000000, %eax + mov %cr0, %eax + jmp 1f +1: + ret + \ No newline at end of file