void kernel_start(uint32_t magic, uint32_t addr) { PRATTLE("\n////////////////// IncludeOS kernel start ////////////////// \n"); PRATTLE("* Booted with magic 0x%x, grub @ 0x%x \n", magic, addr); // generate checksums of read-only areas etc. __init_sanity_checks(); PRATTLE("* Grub magic: 0x%x, grub info @ 0x%x\n", magic, addr); // Determine where free memory starts extern char _end; uintptr_t free_mem_begin = reinterpret_cast<uintptr_t>(&_end); uintptr_t memory_end = kernel::memory_end(); if (magic == MULTIBOOT_BOOTLOADER_MAGIC) { free_mem_begin = _multiboot_free_begin(addr); memory_end = _multiboot_memory_end(addr); } else if (kernel::is_softreset_magic(magic)) { memory_end = kernel::softreset_memory_end(addr); } PRATTLE("* Free mem begin: 0x%zx, memory end: 0x%zx \n", free_mem_begin, memory_end); PRATTLE("* Moving symbols. \n"); // Preserve symbols from the ELF binary free_mem_begin += _move_symbols(free_mem_begin); PRATTLE("* Free mem moved to: %p \n", (void*) free_mem_begin); PRATTLE("* Init .bss\n"); _init_bss(); // Instantiate machine size_t memsize = memory_end - free_mem_begin; __machine = os::Machine::create((void*)free_mem_begin, memsize); PRATTLE("* Init ELF parser\n"); _init_elf_parser(); // Begin portable HAL initialization __machine->init(); // TODO: Move more stuff into Machine::init RNG::init(); PRATTLE("* Init syscalls\n"); _init_syscalls(); PRATTLE("* Init CPU exceptions\n"); x86::idt_initialize_for_cpu(0); x86::init_libc(magic, addr); }
void kernel_start(uintptr_t magic, uintptr_t addr) { // Initialize default serial port __init_serial1(); // generate checksums of read-only areas etc. __init_sanity_checks(); // Determine where free memory starts extern char _end; uintptr_t free_mem_begin = reinterpret_cast<uintptr_t>(&_end); if (magic == MULTIBOOT_BOOTLOADER_MAGIC) { free_mem_begin = _multiboot_free_begin(addr); } // Preserve symbols from the ELF binary free_mem_begin += _move_symbols(free_mem_begin); // Initialize zero-initialized vars _init_bss(); // Initialize heap _init_heap(free_mem_begin); // Initialize stack-unwinder, call global constructors etc. _init_c_runtime(); // Initialize system calls _init_syscalls(); // Initialize early OS, platform and devices OS::start(magic, addr); // Initialize common subsystems and call Service::start OS::post_start(); // verify certain read-only sections in memory kernel_sanity_checks(); // Starting event loop from here allows us to profile OS::start OS::event_loop(); }