Luna/kernel/src/main.cpp

99 lines
2.1 KiB
C++
Raw Normal View History

2022-09-07 13:02:23 +00:00
#define MODULE "main"
2022-09-05 14:13:51 +00:00
#include "acpi/RSDT.h"
2022-09-11 06:23:32 +00:00
#include "assert.h"
2022-09-07 13:02:54 +00:00
#include "config.h"
2022-09-05 14:13:51 +00:00
#include "cpu/CPU.h"
#include "fs/VFS.h"
#include "fs/devices/DeviceFS.h"
2022-09-05 14:13:51 +00:00
#include "gdt/GDT.h"
#include "init/Init.h"
2022-09-14 15:55:24 +00:00
#include "init/InitRD.h"
2022-09-05 14:13:51 +00:00
#include "interrupts/IDT.h"
#include "interrupts/Install.h"
#include "interrupts/Interrupts.h"
2022-09-21 15:57:02 +00:00
#include "io/PCI.h"
2022-09-05 14:13:51 +00:00
#include "io/PIC.h"
#include "io/Serial.h"
2022-09-05 14:13:51 +00:00
#include "log/Log.h"
#include "memory/Memory.h"
#include "memory/MemoryManager.h"
#include "memory/MemoryMap.h"
#include "memory/PMM.h"
2022-09-23 14:41:43 +00:00
#include "memory/VMM.h"
#include "misc/PCITypes.h"
2022-09-21 15:56:53 +00:00
#include "misc/reboot.h"
2022-09-25 14:56:00 +00:00
#include "panic/Panic.h"
2022-09-14 16:54:40 +00:00
#include "rand/Mersenne.h"
2022-09-10 16:42:40 +00:00
#include "render/Framebuffer.h"
2022-09-11 06:23:32 +00:00
#include "render/TextRenderer.h"
2022-09-05 14:13:51 +00:00
#include "std/stdio.h"
#include "std/stdlib.h"
#include "std/string.h"
#include "sys/elf/ELFLoader.h"
2022-09-21 15:56:53 +00:00
#include "thread/PIT.h"
#include "thread/Scheduler.h"
2022-09-05 14:13:51 +00:00
extern "C" void _start()
{
Init::check_magic();
Init::disable_smp(); // Put all other cores except the bootstrap one in an infinite loop
Init::early_init();
kinfoln("Starting Moon %s", moon_version());
CPU::log_cpu_information();
Memory::walk_memory_map();
2022-09-05 14:13:51 +00:00
GDT::load();
kinfoln("Loaded GDT");
Interrupts::install();
IDT::load();
kinfoln("Loaded IDT");
PIC::remap();
PIC::enable_master(0b11111100); // enable keyboard and PIT
PIC::enable_slave(0b11111111);
kinfoln("Prepared PIC");
PIT::initialize(1000); // 1000 times per second
2022-09-05 14:13:51 +00:00
kinfoln("Prepared PIT");
Scheduler::init();
2022-09-05 14:13:51 +00:00
kinfoln("Prepared scheduler");
Scheduler::add_kernel_task([]() {
while (1)
{
sleep(400);
Scheduler::reap_tasks();
}
});
Scheduler::load_user_task("/bin/init");
kinfoln("Prepared scheduler tasks");
2022-09-05 14:13:51 +00:00
2022-10-11 17:53:55 +00:00
ASSERT(VFS::mkdir("/", "dev") == 0);
VFS::mount("/dev", DeviceFS::get());
2022-10-11 17:53:55 +00:00
Init::finish_kernel_boot();
2022-10-11 17:51:24 +00:00
Interrupts::enable(); // Task switching commences here
2022-09-06 09:48:06 +00:00
kinfoln("Interrupts enabled");
2022-09-23 15:24:45 +00:00
PCI::scan([](PCI::Device& dev) {
kinfoln("Found PCI device %x:%x, %s", dev.id().vendor, dev.id().device, pci_type_name(dev.type()));
2022-09-21 15:57:02 +00:00
});
Scheduler::exit(0);
2022-09-05 14:13:51 +00:00
}