X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/69777bdcab284335651a8002e2896f3862fa423d..d0e3d2eb32f32869bb54b5724e19780c83fb592b:/lunaix-os/kernel/lunad.c diff --git a/lunaix-os/kernel/lunad.c b/lunaix-os/kernel/lunad.c index 34368b6..25ce7d2 100644 --- a/lunaix-os/kernel/lunad.c +++ b/lunaix-os/kernel/lunad.c @@ -2,7 +2,6 @@ #include #include #include -#include #include #include #include @@ -10,6 +9,8 @@ #include #include #include +#include +#include #include @@ -21,16 +22,33 @@ init_platform(); int mount_bootmedium() { - struct v_dnode* dnode; int errno = 0; - struct device* dev = probe_boot_medium(); + char* rootfs; + struct v_dnode* dn; + struct device* dev; + + if (!kcmd_get_option("rootfs", &rootfs)) { + ERROR("no rootfs."); + return 0; + } + + if ((errno = vfs_walk(NULL, rootfs, &dn, NULL, 0))) { + ERROR("%s: no such file (%d)", rootfs, errno); + return 0; + } + + dev = resolve_device(dn->inode->data); if (!dev) { - ERROR("fail to acquire device. (%d)", errno); + ERROR("%s: not a device", rootfs); return 0; } - if ((errno = vfs_mount("/mnt/lunaix-os", "iso9660", dev, 0))) { - ERROR("fail to mount boot medium. (%d)", errno); + // unmount the /dev to put old root fs in clear + must_success(vfs_unmount("/dev")); + + // re-mount the root fs with our device. + if ((errno = vfs_mount_root(NULL, dev))) { + ERROR("mount root failed: %s (%d)", rootfs, errno); return 0; } @@ -41,8 +59,12 @@ int exec_initd() { int errno = 0; + const char* argv[] = { "/init", 0 }; + const char* envp[] = { 0 }; + + kcmd_get_option("init", (char**)&argv[0]); - if ((errno = exec_kexecve("/mnt/lunaix-os/usr/bin/init", NULL, NULL))) { + if ((errno = exec_kexecve(argv[0], argv, envp))) { goto fail; } @@ -56,13 +78,24 @@ fail: static void lunad_do_usr() { // No, these are not preemptive - cpu_disable_interrupt(); - - if (!mount_bootmedium() || !exec_initd()) { + no_preemption(); + + if (!exec_initd()) { fail("failed to initd"); } } +static void +__thread_cleaner() +{ + while (true) + { + cleanup_detached_threads(); + kthread_sleep(30); + } +} + + /** * @brief LunaixOS的内核进程,该进程永远为可执行。 * @@ -71,42 +104,36 @@ lunad_do_usr() { * 同时,该进程也负责fork出我们的init进程。 * */ -void _preemptible +void lunad_main() { - spawn_kthread((ptr_t)init_platform); + kthread_spawn((ptr_t)init_platform); + kthread_spawn((ptr_t)__thread_cleaner); - /* - NOTE Kernel preemption after this point. - - More specifically, it is not a real kernel preemption (as in preemption - happened at any point of kernel, except those marked explicitly). - In Lunaix, things are designed in an non-preemptive fashion, we implement - kernel preemption the other way around: only selected kernel functions which, - of course, with great care of preemptive assumption, will goes into kernel - thread (which is preemptive!) - */ - - cpu_enable_interrupt(); while (1) { - cleanup_detached_threads(); - sched_pass(); + yield_current(); } } void init_platform() -{ +{ device_postboot_load(); invoke_init_function(on_postboot); twifs_register_plugins(); + if (!mount_bootmedium()) { + ERROR("failed to boot"); + goto exit; + } + // FIXME Re-design needed!! // sdbg_init(); assert(!spawn_process(NULL, (ptr_t)lunad_do_usr, true)); +exit: exit_thread(NULL); } \ No newline at end of file