#include "gdt.hpp" #include "idt.hpp" #include "memory.hpp" #include "multiboot.hpp" #include "pic.hpp" #include "pit.hpp" #include "tasking.hpp" #include "vgaterminal.hpp" static VGATerminal vga; TextOutput& term = vga; static volatile bool termBusy = false; void kernel_main(void) { term.write("Clyne's kernel, v2024\n\n"); if (!multiboot_initialize()) for (;;); idt_register_callback(14, [](const Registers& regs) { term.write("Page fault! eip="); term.write(regs.eip); term.write('\n'); for (;;); }); memory_initialize(); gdt_initialize(); pic_initialize(); idt_initialize(); pit_initialize(100); asm volatile("sti"); tasking_initialize(); term.write("Tasking enabled.\n"); tasking_spawn([] { for (;;) { do pit_busy_wait(1); while (termBusy); termBusy = true; term.write('B'); termBusy = false; } }, 256); tasking_spawn([] { for (;;) { do pit_busy_wait(1); while (termBusy); termBusy = true; term.write('C'); termBusy = false; } }, 256); for (;;) { do pit_busy_wait(1); while (termBusy); termBusy = true; term.write('A'); termBusy = false; } } extern "C" void memmove(char* dst, char* src, size_t sz) { while (sz) { *dst = *src; ++dst; ++src; --sz; } }