Files
RockOS/kernel/kmain.c
2026-06-30 00:03:21 -05:00

105 lines
2.6 KiB
C

#include "multiboot.h"
#include "interrupts.h"
#include "gdt.h"
#include "scheduler.h"
#include "common.h"
#include "vfs.h"
#include <lib/print.h>
#include <lib/stream.h>
#include <lib/memory.h>
#include <memory/mm.h>
#include <drivers/iso/iso.h>
#include <drivers/ide/ide.h>
#include <drivers/pic/pic.h>
#include <drivers/ps2/ps2.h>
#include <drivers/pit/pit.h>
#include <drivers/vga/vga.h>
#include <drivers/cpio/cpio.h>
#include <stddef.h>
#include <stdint.h>
extern char __kernel_start;
extern char __kernel_end;
void parse_multiboot_modules(uint32_t mbi_vaddr) {
// find where grub put the boot module containing initrd
multiboot_info* mbi = (multiboot_info*)mbi_vaddr;
uint32_t mod_count = mbi->mods_count;
multiboot_module_t* mod = (multiboot_module_t*)((uint32_t)mbi->mods_addr + 0xC0000000);
kprintf("found %d mods starting @ [v]0x%x\n", mod_count, (uint32_t)mod);
for (uint32_t i = 0; i < mod_count; i++) {
uint32_t start = mod[i].mod_start;
uint32_t end = mod[i].mod_end;
uint32_t cmdline = mod[i].cmdline;
multiboot_module_info_table[i].mod_start = start + 0xC0000000;
multiboot_module_info_table[i].mod_end = end + 0xC0000000;
multiboot_module_info_table[i].cmdline = cmdline + 0xC0000000;
}
}
vfs_node_t* load_initrd() {
multiboot_module_t* initrd_module = &multiboot_module_info_table[0];
kprintf("initrd found @ [v] 0x%x\n", initrd_module->mod_start);
return cpio_read_fs(initrd_module->mod_start);
}
void load_origin_program() {
vfs_node_t* vfs_root = vfs_create_root();
vfs_node_t* initrd_root = load_initrd();
if (initrd_root) {
mount(vfs_root, initrd_root);
kprintf("initrd read, mounted @ /\n");
int fd = open("/origin.elf", 0);
if (fd == -1) {
kprintf("failed to read origin program\n");
}
void* buf = kalloc(512);
int rd = read(fd, buf, 512);
if (rd > 0) {
kprintf("read %d bytes from origin.elf\n", rd);
}
}
exit();
}
void kmain(uint32_t magic, multiboot_info* mbi) {
disable_interrupts();
if (!(mbi->flags & (1 << 6))) {
return;
}
vga_init();
uint32_t mmap_virtual_addr = mbi->mmap_addr + 0xC0000000;
init_pmm((void*)mmap_virtual_addr, mbi->mmap_length);
kprintf("memory detection complete. total free memory: %dMB\n", total_free_memory() / 1024 / 1024);
init_gdt();
init_idt();
init_pic();
init_pit();
init_page_tables();
parse_multiboot_modules((uint32_t)mbi);
kprintf("basic initializations complete\n");
disable_interrupts();
init_scheduler();
enable_interrupts();
create_task((uint32_t)load_origin_program, fetch_cr3());
}