void kernel_init(multiboot_info_t* mb_info, unsigned int magic) { terminal_initialize(); terminal_writestring("Project Omamori now starting...\n"); gdt_init(); idt_init(); initialize_vmem_allocator(); k_heap_init(); initialize_pageframes(mb_info); // do global constructor setup kprintf("Calling global constructors.\n"); size_t *current = (size_t*)((size_t)&__CTOR_LIST__+4); // skip the first function pointer int n_constructors_called = 1; while(true) { if(*current == 0) break; //kprintf("Calling constructor %u at address 0x%x.\n", (unsigned long long int)n_constructors_called, ((unsigned long long int)*current) ); void(*func)(void) = (void(*)(void))(*current); func(); current++; n_constructors_called++; } kprintf("Called %u global constructors.\n", (unsigned long long int)n_constructors_called); //system_halt; kprintf("Kernel begins at physical address 0x%x, corresponding to pageframe ID %u.\n", (unsigned long long int)(&kernel_start_phys), (unsigned long long int)(pageframe_get_block_from_addr( (size_t)&kernel_start_phys )) ); kprintf("Kernel ends at physical address 0x%x, corresponding to pageframe ID %u.\n", (unsigned long long int)(&kernel_end_phys), (unsigned long long int)(pageframe_get_block_from_addr( (size_t)&kernel_end_phys )) ); terminal_writestring("\nInitializing PICs.\n"); pic_initialize(PIC_IRQ_OFFSET_1, PIC_IRQ_OFFSET_2); set_all_irq_status(true); terminal_writestring("Initializing PIT.\n"); pit_initialize(PIT_DEFAULT_FREQ_DIVISOR); //system_halt }
void kernel_main(unsigned long magic, unsigned long addr) { multiboot_info_t *mbi; if (magic != MULTIBOOT_BOOTLOADER_MAGIC) return; mbi = (multiboot_info_t*)addr; /* kernel init */ serial_init(DEBUG_SERIAL_PORT, DEBUG_SERIAL_SPEED, UART_8BITS_WORD, UART_NO_PARITY, UART_1_STOP_BIT); cls(); cpu_cli(); printf("[x] interrupts disabled\n"); gdt_initialize(); printf("[x] gdt initialized\n"); idt_initialize(); printf("[x] idt initialized\n"); breakpoint_initialize(); #if defined(USE_APIC) apic_initialize(); serial_printl("[x] apic initialized\n"); #else pic_initialize(); serial_printl("[x] pic initialized\n"); #endif /* USE_APIC */ /* initialize the kernel */ { kernel_init(mbi); } /* memory initialization */ { phys_init(mbi); phys_debug(); /* vm_init(); */ /* unit_test_vm(); */ /* cpu_hlt(); */ } #if defined(USE_PCI) pci_initialize(); pci_list(); #endif cpu_sti(); #if defined(USE_TASK) { /* subsystems */ event_initialize(); sched_initialize(); task_initialize(); /* tasks */ idle_initialize(); muksh_initialize(); net_initialize(); /* task_test(); */ /* start scheduling */ sched_start(); } #endif /* endless loop */ serial_printl("[?] kernel loop\n"); while (1) { serial_printl("k"); cpu_hlt(); } }