#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void spawn_lunad(); void kmem_init(struct boot_handoff* bhctx); void kernel_bootstrap(struct boot_handoff* bhctx) { vmm_init(); pmm_init(bhctx); // now we can start reserving physical space /* Begin kernel bootstrapping sequence */ boot_begin(bhctx); tty_init(ioremap(0xB8000, PAGE_SIZE)); /* Setup kernel memory layout and services */ kmem_init(bhctx); // FIXME this goes to hal/gfxa tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_BLACK); boot_parse_cmdline(bhctx); /* Prepare stack trace environment */ trace_modksyms_init(bhctx); device_scan_drivers(); device_sysconf_load(); invoke_init_function(on_earlyboot); clock_init(); timer_init(); /* TODO autoload these init function that do not have dependency between them */ /* Let's get fs online as soon as possible, as things rely on them */ vfs_init(); fsm_init(); input_init(); block_init(); sched_init(); device_onboot_load(); /* the bare metal are now happy, let's get software over with */ must_success(vfs_mount_root("ramfs", NULL)); must_success(vfs_mount("/dev", "devfs", NULL, 0)); invoke_init_function(on_boot); must_success(vfs_unmount("/dev")); /* Finish up bootstrapping sequence, we are ready to spawn the root process * and start geting into uspace */ boot_end(bhctx); spawn_lunad(); } extern void lunad_main(); /** * @brief 创建并运行Lunaix守护进程 * */ void spawn_lunad() { int has_error; struct thread* kthread; has_error = spawn_process(&kthread, (ptr_t)lunad_main, false); assert_msg(!has_error, "failed to spawn lunad"); run(kthread); fail("Unexpected Return"); } void kmem_init(struct boot_handoff* bhctx) { pte_t* ptep = mkptep_va(VMS_SELF, KERNEL_RESIDENT); ptep = mkl0tep(ptep); unsigned int i = ptep_vfn(ptep); do { if (l0tep_impile_vmnts(ptep)) { ptep++; continue; } #if LnT_ENABLED(1) assert(mkl1t(ptep++, 0, KERNEL_DATA)); #elif LnT_ENABLED(2) assert(mkl2t(ptep++, 0, KERNEL_DATA)); #elif LnT_ENABLED(3) assert(mkl3t(ptep++, 0, KERNEL_DATA)); #else assert(mklft(ptep++, 0, KERNEL_DATA)); #endif } while (++i < MAX_PTEN); // allocators cake_init(); valloc_init(); }