void pg_init() { //Find end of kernel struct multiboot_information* mboot=get_multiboot_info(); unsigned int i=0; unsigned int kernend=(unsigned int)&end; for(i=0;i<mboot->mods_count;i++){ if(mboot->mods_addr[i].mod_end>kernend){ kernend=mboot->mods_addr[i].mod_end; } } //Paging variables pg_page_size=0x1000; pg_page_bitmap = (unsigned int*)(((kernend + pg_page_size-1)/pg_page_size)*pg_page_size); pg_page_bitmap_size = 0; //Find free pages pg_find_pages(); //Allocate kernel directory pg_kernel_directory = pg_physical_page_alloc(); pg_init_directory(pg_kernel_directory); //Map kernel pages unsigned int page; unsigned range = (unsigned)pg_page_bitmap / pg_page_size + pg_page_bitmap_size; for(page = 0; page < range; page++) { void* address=(void*)(page*pg_page_size); pg_map_page(pg_kernel_directory, address, address, 2); } //Set to the kernel directory pg_set_directory(pg_kernel_directory); }
int lib_get_sysinfo(void) { int ret; /* Get the CPU speed (for delays). */ lib_sysinfo.cpu_khz = get_cpu_speed(); #if IS_ENABLED(CONFIG_LP_MULTIBOOT) /* Get the information from the multiboot tables, * if they exist */ get_multiboot_info(&lib_sysinfo); #endif /* Get information from the coreboot tables, * if they exist */ ret = get_coreboot_info(&lib_sysinfo); if (!lib_sysinfo.n_memranges) { /* If we can't get a good memory range, use the default. */ lib_sysinfo.n_memranges = 2; lib_sysinfo.memrange[0].base = 0; lib_sysinfo.memrange[0].size = 640 * 1024; lib_sysinfo.memrange[0].type = CB_MEM_RAM; lib_sysinfo.memrange[1].base = 1024 * 1024; lib_sysinfo.memrange[1].size = 31 * 1024 * 1024; lib_sysinfo.memrange[1].type = CB_MEM_RAM; } return ret; }
void kmain(struct multiboot_info *mbt) { vga_init(); gdt_install(); idt_install(); isr_install(); irq_install(); syscalls_install(); puts_c(__kernel_name " kernel v" __kernel_version_str "\n\n", COLOR_LIGHT_BLUE, COLOR_DEFAULT_BG); uint64_t mem; get_multiboot_info(mbt, &mem); extern uint32_t _kernel_memory_end[]; kprintf("End of kernel's memory: 0x%x\n", (uint64_t) (uint32_t) _kernel_memory_end); kprintf("Memory:\n%l B\n%l KB\n%l MB\n%l GB\n", mem, mem / 1024, mem / 1024 / 1024, mem / 1024 / 1024 / 1024); init_paging(); map_page(0xFD7FF000, 0x60000, 3); int *p = (int *) 0xFD7FF000; *p = 12; kprintf("*(0x%x) = %i\n", (uint64_t) (uint32_t) p, *p); map_page(0x10000000, 0x60000, 3); int *p2 = (int *) 0x10000000; kprintf("*(0x%x) = %i\n", (uint64_t) (uint32_t) p2, *p2); print_next_available_page(); uint32_t ap = allocate_page(203); map_page(ap, 0x60000, 3); int *p3 = (int *) ap; kprintf("*(0x%x) = %i\n", (uint64_t) ap, *p3); print_next_available_page(); ap = allocate_page(203); kprintf("ap = 0x%x\n", (uint32_t) ap); struct kthread thread; create_kthread(thread_test, &thread); start_kthread(&thread); kprintf("Returned from thread.\n"); _asm_print_test(); return; }