boot page table works
This commit is contained in:
@@ -31,6 +31,8 @@ _start:
|
|||||||
jmp *%ecx
|
jmp *%ecx
|
||||||
higher:
|
higher:
|
||||||
mov $stack_top, %esp
|
mov $stack_top, %esp
|
||||||
|
mov $0xC0000000, %eax
|
||||||
|
add %eax, %ebx
|
||||||
push %ebx
|
push %ebx
|
||||||
push %eax
|
push %eax
|
||||||
call kmain
|
call kmain
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#define PIC1_ADDR 0x20
|
#define PIC1_ADDR 0x20 + 0xC0000000
|
||||||
#define PIC2_ADDR 0xA0
|
#define PIC2_ADDR 0xA0 + 0xC0000000
|
||||||
#define PIC1_COMMAND PIC1_ADDR
|
#define PIC1_COMMAND PIC1_ADDR
|
||||||
#define PIC1_DATA (PIC1_ADDR+1)
|
#define PIC1_DATA (PIC1_ADDR+1)
|
||||||
#define PIC2_COMMAND PIC2_ADDR
|
#define PIC2_COMMAND PIC2_ADDR
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#define VGA_WIDTH 80
|
#define VGA_WIDTH 80
|
||||||
#define VGA_HEIGHT 25
|
#define VGA_HEIGHT 25
|
||||||
#define VGA_MEMORY 0xB8000
|
#define VGA_MEMORY (0xB8000 + 0xC0000000)
|
||||||
|
|
||||||
enum vga_color {
|
enum vga_color {
|
||||||
VGA_COLOR_BLACK = 0,
|
VGA_COLOR_BLACK = 0,
|
||||||
|
|||||||
@@ -27,13 +27,30 @@ void kmain(uint32_t magic, multiboot_info* mbi) {
|
|||||||
kout = &vga_print_stream;
|
kout = &vga_print_stream;
|
||||||
kout->trunc();
|
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();
|
init_gdt();
|
||||||
kprintf("GDT set\n");
|
extern uint64_t gdt[5];
|
||||||
|
kprintf("GDT set @ 0x%x\n", &gdt);
|
||||||
|
|
||||||
init_idt();
|
init_idt();
|
||||||
kprintf("IDT set\n");
|
extern idt_entry idt[256];
|
||||||
|
kprintf("IDT set @ 0x%x\n", &idt);
|
||||||
|
|
||||||
init_pic();
|
init_pic();
|
||||||
kprintf("PIC initialized\n");
|
kprintf("PIC initialized\n");
|
||||||
@@ -41,30 +58,15 @@ void kmain(uint32_t magic, multiboot_info* mbi) {
|
|||||||
init_pit();
|
init_pit();
|
||||||
kprintf("PIT initialized\n");
|
kprintf("PIT initialized\n");
|
||||||
|
|
||||||
int result = init_ps2();
|
// int result = init_ps2();
|
||||||
if (result == -1) {
|
// if (result == -1) {
|
||||||
kprintf("PS2 init failed\n");
|
// kprintf("PS2 init failed\n");
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
kprintf("PS2 initialized\n");
|
// 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);
|
|
||||||
|
|
||||||
init_page_tables();
|
init_page_tables();
|
||||||
kprintf("Page tables reloaded");
|
kprintf("Page tables initialized\n");
|
||||||
|
|
||||||
while(1);
|
while(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include "lib/print.h"
|
||||||
#include "multiboot.h"
|
#include "multiboot.h"
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
@@ -5,10 +6,21 @@
|
|||||||
extern uint8_t __kernel_start;
|
extern uint8_t __kernel_start;
|
||||||
extern uint8_t __kernel_end;
|
extern uint8_t __kernel_end;
|
||||||
|
|
||||||
|
extern uint32_t page_directory[1024];
|
||||||
|
extern void flush_tlb();
|
||||||
|
extern void disable_pae();
|
||||||
|
|
||||||
#define PAGE_SIZE 4096
|
#define PAGE_SIZE 4096
|
||||||
#define MAX_RAM 0xFFFFFFFF // 4GB
|
#define MAX_RAM 0xFFFFFFFF // 4GB
|
||||||
#define BITMAP_SIZE ((MAX_RAM / PAGE_SIZE) / 8)
|
#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 max_address = 0;
|
||||||
static uint32_t total_available_memory = 0;
|
static uint32_t total_available_memory = 0;
|
||||||
static uint8_t memory_bitmap[BITMAP_SIZE];
|
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_start = (uint32_t)&__kernel_start - 0xC0000000;
|
||||||
uint32_t kernel_phys_end = (uint32_t)&__kernel_end - 0xC0000000;
|
uint32_t kernel_phys_end = (uint32_t)&__kernel_end - 0xC0000000;
|
||||||
for (uint32_t addr = usable_start; addr < usable_end; addr += 4096) {
|
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;
|
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) {
|
static void* p_alloc_frame() {
|
||||||
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() {
|
|
||||||
for (uint32_t i = 0; i < BITMAP_SIZE; i++) {
|
for (uint32_t i = 0; i < BITMAP_SIZE; i++) {
|
||||||
uint8_t b = memory_bitmap[i];
|
uint8_t b = memory_bitmap[i];
|
||||||
if (b == 0xFF) {
|
if (b == 0xFF) {
|
||||||
@@ -104,7 +101,7 @@ void* alloc_phys_page() {
|
|||||||
if ((b & (1 << bit)) == 0) {
|
if ((b & (1 << bit)) == 0) {
|
||||||
uint32_t page_addr = (i * 8 + bit) * PAGE_SIZE;
|
uint32_t page_addr = (i * 8 + bit) * PAGE_SIZE;
|
||||||
mark_used(page_addr);
|
mark_used(page_addr);
|
||||||
return (void*)(page_addr + 0xC0000000);
|
return (void*)page_addr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -112,19 +109,59 @@ void* alloc_phys_page() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_phys_page(void* addr) {
|
static void p_free_frame(void* addr) {
|
||||||
mark_free((uint32_t)addr);
|
mark_free((uint32_t)addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern uint32_t page_directory[1024];
|
static void map_page(uint32_t vaddr, uint32_t paddr, uint32_t flags) {
|
||||||
extern void flush_tlb();
|
uint32_t pde_entry = vaddr >> 22;
|
||||||
extern void disable_pae();
|
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() {
|
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++) {
|
for (int i = 0; i < 1024; i++) {
|
||||||
kernel_table[i] = (i * PAGE_SIZE) | 0x3;
|
kernel_table[i] = (i * PAGE_SIZE) | 0x3;
|
||||||
}
|
}
|
||||||
uint32_t* phys_table = kernel_table - 0xC000000;
|
page_directory[768] = (uint32_t)(kernel_table) | 0x3;
|
||||||
page_directory[768] = (uint32_t)(phys_table) | 0x3;
|
page_directory[0] = 0;
|
||||||
|
disable_pae();
|
||||||
flush_tlb();
|
flush_tlb();
|
||||||
|
}
|
||||||
|
|
||||||
|
void* init_kheap() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t total_free_memory() {
|
||||||
|
return total_available_memory;
|
||||||
}
|
}
|
||||||
@@ -8,11 +8,9 @@ typedef struct __attribute__((packed)) {
|
|||||||
} mem_page_t;
|
} mem_page_t;
|
||||||
|
|
||||||
void init_pmm(void* mmap_base, uint32_t mmap_limit);
|
void init_pmm(void* mmap_base, uint32_t mmap_limit);
|
||||||
|
void init_page_tables();
|
||||||
|
void* init_kheap();
|
||||||
|
|
||||||
uint32_t total_free_memory();
|
uint32_t total_free_memory();
|
||||||
|
|
||||||
void* alloc_page();
|
|
||||||
void free_page(void* addr);
|
|
||||||
|
|
||||||
void init_page_tables();
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -7,5 +7,8 @@ flush_tlb:
|
|||||||
|
|
||||||
.global disable_pae
|
.global disable_pae
|
||||||
disable_pae:
|
disable_pae:
|
||||||
|
mov %cr4, %edx
|
||||||
|
and $0xFFFFFFEF, %edx
|
||||||
|
mov %edx, %cr4
|
||||||
ret
|
ret
|
||||||
|
|
||||||
Reference in New Issue
Block a user