#define FOOLOS_MODULE_NAME "kernel" #include "kernel.h" #include #include #include "syscalls.h" #include "types.h" #include "lib/logger/log.h" #include "fifo.h" #include "timer.h" #include "mem.h" #include "vmem.h" #include "mp.h" #include "interrupts.h" #include "multiboot.h" #include "ringbuffer.h" #include "task.h" #include "multiboot.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(); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%s - BUILD: git-%s (%s %s)", KERNEL_NAME,GIT_REVISION,__DATE__,__TIME__); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"COM 1 - initialized"); uint64_t epoch_time=timer_init(); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"PIT - initialized. %u seconds passed since 1970.",epoch_time); // KEYBOARD DRIVER keyboard_init(0); //sstdin // MOUSE DRIVER mouse_init(); // GDT gdt_setup(); // MULTIBOOT HEADER multiboot_information *info=get_multiboot(eax, ebx); // Gather Info about other processors. (APs = application processors) // ACPI or MP //smp_processors procdata; // //if(!acpi_find(&procdata)) // if(!mp_find(&procdata)) // panic(FOOLOS_MODULE_NAME,"ACPI and MP search failed! I do not want to continue!"); // MEMORY INIT (allows allocating and deaclloating physical memory) uint32_t kernel_blocks=mem_init(info); // Mount Root EXT2 ramimage (needs to be done before other processors started, because of /boot/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 // smp_log_procdata(&procdata); // smp_start_aps(&procdata,"/boot/mp.bin"); //will be copied over mbr // VIRTUAL MEMORY (paging) pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr); // PCI Bus //pci_init(); // INIT VESA: TODO: stop and say if not 32bit colormode! 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); // STREAMS 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 // START INTERRUPTS (code segment: 0x08) int_init(0x08); // INIT MULTITASKING (and switch to our pseudo-usermode) task_init(dir); // we should never reach this panic(FOOLOS_MODULE_NAME,"reached end of kernel.c !!"); }