diff --git a/kernel/boot/boot.S b/kernel/boot/boot.S index 5559b3f..21303ab 100644 --- a/kernel/boot/boot.S +++ b/kernel/boot/boot.S @@ -31,6 +31,8 @@ _start: jmp *%ecx higher: mov $stack_top, %esp + mov $0xC0000000, %eax + add %eax, %ebx push %ebx push %eax call kmain diff --git a/kernel/drivers/pic/pic.h b/kernel/drivers/pic/pic.h index 8b4223e..5d3e795 100644 --- a/kernel/drivers/pic/pic.h +++ b/kernel/drivers/pic/pic.h @@ -1,5 +1,5 @@ -#define PIC1_ADDR 0x20 -#define PIC2_ADDR 0xA0 +#define PIC1_ADDR 0x20 + 0xC0000000 +#define PIC2_ADDR 0xA0 + 0xC0000000 #define PIC1_COMMAND PIC1_ADDR #define PIC1_DATA (PIC1_ADDR+1) #define PIC2_COMMAND PIC2_ADDR diff --git a/kernel/drivers/vga/vga_stream_writer.c b/kernel/drivers/vga/vga_stream_writer.c index 3299185..88a43a0 100644 --- a/kernel/drivers/vga/vga_stream_writer.c +++ b/kernel/drivers/vga/vga_stream_writer.c @@ -5,7 +5,7 @@ #define VGA_WIDTH 80 #define VGA_HEIGHT 25 -#define VGA_MEMORY 0xB8000 +#define VGA_MEMORY (0xB8000 + 0xC0000000) enum vga_color { VGA_COLOR_BLACK = 0, diff --git a/kernel/kmain.c b/kernel/kmain.c index 5cf5f3d..90ff2f0 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -27,13 +27,30 @@ void kmain(uint32_t magic, multiboot_info* mbi) { kout = &vga_print_stream; kout->trunc(); - kprintf("RockOS booting...\n"); + kprintf("kernel start: 0x%x\n", &__kernel_start); + kprintf("kernel end: 0x%x\n", &__kernel_end); + uint32_t size = (&__kernel_end - &__kernel_start) / 1024; + kprintf("kernel size: %dKB\n", size); + if (!(mbi->flags & (1 << 6))) { + return; + } + + kprintf("multiboot virtual address: 0x%x\n", mbi); + uint32_t mmap_virtual_addr = mbi->mmap_addr + 0xC0000000; + kprintf("mmap virtual address: 0x%x\n", mmap_virtual_addr); + init_pmm((void*)mmap_virtual_addr, mbi->mmap_length); + uint32_t mem_size = total_free_memory(); + kprintf("Total available memory: %d MB\n", mem_size / 1024 / 1024); + + kprintf("RockOS booting...\n"); init_gdt(); - kprintf("GDT set\n"); + extern uint64_t gdt[5]; + kprintf("GDT set @ 0x%x\n", &gdt); init_idt(); - kprintf("IDT set\n"); + extern idt_entry idt[256]; + kprintf("IDT set @ 0x%x\n", &idt); init_pic(); kprintf("PIC initialized\n"); @@ -41,30 +58,15 @@ void kmain(uint32_t magic, multiboot_info* mbi) { init_pit(); kprintf("PIT initialized\n"); - int result = init_ps2(); - if (result == -1) { - kprintf("PS2 init failed\n"); - return; - } - kprintf("PS2 initialized\n"); - - if (!(mbi->flags & (1 << 6))) { - return; - } - - init_pmm((void*)mbi->mmap_addr, mbi->mmap_length); - uint32_t mem_size = total_free_memory(); - kprintf("Total available memory: %d MB\n", mem_size / 1024 / 1024); - - kprintf("__kernel_start: 0x%x\n", &__kernel_start); - kprintf("__kernel_end: 0x%x\n", &__kernel_end); - extern uint32_t page_directory[1024]; - kprintf("page directory: 0x%x\n", &page_directory); - uint32_t size = (&__kernel_end - &__kernel_start) / 1024; - kprintf("kernel size: %dKB\n", size); + // int result = init_ps2(); + // if (result == -1) { + // kprintf("PS2 init failed\n"); + // return; + // } + // kprintf("PS2 initialized\n"); init_page_tables(); - kprintf("Page tables reloaded"); + kprintf("Page tables initialized\n"); while(1); } diff --git a/kernel/memory/mm.c b/kernel/memory/mm.c index 73f2232..e9c7f41 100644 --- a/kernel/memory/mm.c +++ b/kernel/memory/mm.c @@ -1,3 +1,4 @@ +#include "lib/print.h" #include "multiboot.h" #include @@ -5,10 +6,21 @@ extern uint8_t __kernel_start; extern uint8_t __kernel_end; +extern uint32_t page_directory[1024]; +extern void flush_tlb(); +extern void disable_pae(); + #define PAGE_SIZE 4096 #define MAX_RAM 0xFFFFFFFF // 4GB #define BITMAP_SIZE ((MAX_RAM / PAGE_SIZE) / 8) +#define PAGE_TABLES 0xFFC00000 +#define PAGE_DIRECTORY 0xFFFFF000 + +#define PAGE_PRESENT 0x1 +#define PAGE_WRITABLE 0x2 +#define PAGE_USER 0x4 + static uint32_t max_address = 0; static uint32_t total_available_memory = 0; static uint8_t memory_bitmap[BITMAP_SIZE]; @@ -57,7 +69,7 @@ static void parse_multiboot_mmap(void* base, uint32_t limit) { uint32_t kernel_phys_start = (uint32_t)&__kernel_start - 0xC0000000; uint32_t kernel_phys_end = (uint32_t)&__kernel_end - 0xC0000000; for (uint32_t addr = usable_start; addr < usable_end; addr += 4096) { - if (addr <= (uint32_t)&kernel_phys_end && addr >= (uint32_t)&kernel_phys_start) { + if (addr <= kernel_phys_end && addr >= kernel_phys_start) { continue; } @@ -78,22 +90,7 @@ static void parse_multiboot_mmap(void* base, uint32_t limit) { } } -void init_pmm(void* mmap_base, uint32_t mmap_limit) { - for (int i = 0; i < BITMAP_SIZE; i++) { - memory_bitmap[i] = 0xFF; - } - - if (mmap_base != NULL && mmap_limit > 0) { - parse_multiboot_mmap(mmap_base, mmap_limit); - } -} - -uint32_t total_free_memory() { - return total_available_memory; -} - -// this returns the virtual address of the physical page allocated -void* alloc_phys_page() { +static void* p_alloc_frame() { for (uint32_t i = 0; i < BITMAP_SIZE; i++) { uint8_t b = memory_bitmap[i]; if (b == 0xFF) { @@ -104,7 +101,7 @@ void* alloc_phys_page() { if ((b & (1 << bit)) == 0) { uint32_t page_addr = (i * 8 + bit) * PAGE_SIZE; mark_used(page_addr); - return (void*)(page_addr + 0xC0000000); + return (void*)page_addr; } } } @@ -112,19 +109,59 @@ void* alloc_phys_page() { return 0; } -void free_phys_page(void* addr) { +static void p_free_frame(void* addr) { mark_free((uint32_t)addr); } -extern uint32_t page_directory[1024]; -extern void flush_tlb(); -extern void disable_pae(); +static void map_page(uint32_t vaddr, uint32_t paddr, uint32_t flags) { + uint32_t pde_entry = vaddr >> 22; + uint32_t pte_entry = (vaddr >> 12) & 0x3FF; + + uint32_t* page_directory = (uint32_t*)PAGE_DIRECTORY; + if (page_directory[pde_entry] & PAGE_PRESENT == 0) { + uint32_t* new_table = (uint32_t*)p_alloc_frame(); + page_directory[pde_entry] = (uint32_t)new_table | flags; + } +} + +static void* p_alloc(uint32_t size_b, uint32_t vstart) { + uint32_t pages = (size_b + PAGE_SIZE - 1) / PAGE_SIZE; + + for (uint32_t i = 0; i < pages; i++) { + uint32_t vaddr = vstart + i * PAGE_SIZE; + uint32_t paddr = (uint32_t)p_alloc_frame(); + + map_page(vaddr, paddr, PAGE_PRESENT | PAGE_WRITABLE); + } + + return (void*)vstart; +} + +void init_pmm(void* mmap_base, uint32_t mmap_limit) { + for (int i = 0; i < BITMAP_SIZE; i++) { + memory_bitmap[i] = 0xFF; + } + + if (mmap_base != NULL && mmap_limit > 0) { + parse_multiboot_mmap(mmap_base, mmap_limit); + } +} + void init_page_tables() { - uint32_t* kernel_table = alloc_phys_page(); + uint32_t* kernel_table = p_alloc_frame(); for (int i = 0; i < 1024; i++) { kernel_table[i] = (i * PAGE_SIZE) | 0x3; } - uint32_t* phys_table = kernel_table - 0xC000000; - page_directory[768] = (uint32_t)(phys_table) | 0x3; + page_directory[768] = (uint32_t)(kernel_table) | 0x3; + page_directory[0] = 0; + disable_pae(); flush_tlb(); +} + +void* init_kheap() { + +} + +uint32_t total_free_memory() { + return total_available_memory; } \ No newline at end of file diff --git a/kernel/memory/mm.h b/kernel/memory/mm.h index 7db3939..355d50d 100644 --- a/kernel/memory/mm.h +++ b/kernel/memory/mm.h @@ -8,11 +8,9 @@ typedef struct __attribute__((packed)) { } mem_page_t; void init_pmm(void* mmap_base, uint32_t mmap_limit); +void init_page_tables(); +void* init_kheap(); + uint32_t total_free_memory(); -void* alloc_page(); -void free_page(void* addr); - -void init_page_tables(); - #endif diff --git a/kernel/memory/mm_stubs.S b/kernel/memory/mm_stubs.S index 9500ca5..5cd8690 100644 --- a/kernel/memory/mm_stubs.S +++ b/kernel/memory/mm_stubs.S @@ -7,5 +7,8 @@ flush_tlb: .global disable_pae disable_pae: + mov %cr4, %edx + and $0xFFFFFFEF, %edx + mov %edx, %cr4 ret \ No newline at end of file