#include #include "kernel/kernel.h" #include "kernel/mem.h" #include "kernel/vmem.h" #include "kernel/gdt.h" #include "kernel/scheduler.h" #include "kernel/multiboot.h" #include "driver/serial.h" #include "driver/timer.h" #include "driver/keyboard.h" #include "driver/mouse.h" #include "syscalls.h" #include "types.h" #include "fifo.h" #include "mp.h" #include "interrupts.h" #include "ringbuffer.h" #include "terminal/terminal.h" #include "driver/screen.h" /* F00L 0S Entry point (called directly from asm/multiboot.asm */ void kernel_main(uint32_t eax,uint32_t ebx) { serial_init(); klog("FOOL-OS ver-%s (%s)",GIT_REVISION,__DATE__); klog("Programmable Interval Timer (PIT) init ..."); uint64_t unixtime=timer_init(); klog("Unix Time = %u seconds)",unixtime); klog("Keyboard init ..."); keyboard_init(0); klog("Mouse init ..."); mouse_init(); klog("Global Descriptor Table (GDT) init ..."); gdt_init(); klog("Multiboot Structures init ... "); multiboot_information *info; info=get_multiboot(eax, ebx); klog("Symmetrical Multi Processing (SMP) init ... "); smp_processors procdata; if(!acpi_find(&procdata)&&!mp_find(&procdata))kpanic("No ACPI or MP found!"); klog("Memory init ... "); uint32_t kernel_blocks=mem_init(info); klog("Ram Filesystem init ... "); // required by mp.bin ???? fs_mount(info); // Start the other Processors (before paging because apic addr etc..?) //TODO: !!! Check commented out sleep ()!!! // https://wiki.osdev.org/Symmetric_Multiprocessing klog("Symmetric Multi Processing (SMP) start ... "); smp_log_procdata(&procdata); //smp_start_aps(&procdata,"/boot/mp.bin"); //will be copied over mbr klog("Vritual Memory / Paging init ... "); pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr); klog("Peripheral Component Interconnet (PCI) init ... "); pci_init(); klog("Video Electronics Standards Association (VESA) init ... "); // TODO check if text or fb? uint32_t addr=kballoc(1); fs_content("/binfont.bin",addr,0x100); // copy 0x100 bytes to 0x7000 vesa_init(info->vbe_control_info,info->vbe_mode_info,addr); klog("stdin/stdout init ..."); uint32_t sstdin = syscall_open("stdin",0,0); // stdin 0 uint32_t sstdout = syscall_open("term",0,0); // stdout 1 uint32_t sstderr = syscall_open("stderr",0,0); // stderr 2 klog("Interrupt Vector Table (IVT) init ..."); interrupts_init(0x08); klog("Enable Interrupts & Start Scheduling ..."); scheduler_init(dir); }