#include <lunaix/exec.h>
#include <lunaix/foptions.h>
#include <lunaix/fs.h>
-#include <lunaix/fs/probe_boot.h>
#include <lunaix/fs/twifs.h>
#include <lunaix/spike.h>
#include <lunaix/syslog.h>
#include <lunaix/owloysius.h>
#include <lunaix/sched.h>
#include <lunaix/kpreempt.h>
+#include <lunaix/kcmd.h>
+#include <lunaix/kthread.h>
#include <klibc/string.h>
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;
}
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;
}
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的内核进程,该进程永远为可执行。
*
* 同时,该进程也负责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