Переглянути джерело

refactor: move init script out of init_vfs

init script is now in /mnt

create /dev/null and /dev/console in init script

change node device format: 8 bit major and 8 bit minor

check nullptr before performing TIOCGPGRP
greatbridf 11 місяців тому
батько
коміт
94f3cee3e5
6 змінених файлів з 61 додано та 31 видалено
  1. 1 0
      CMakeLists.txt
  2. 3 3
      include/kernel/vfs.hpp
  3. 24 0
      init_script.sh
  4. 2 6
      src/kernel/process.cpp
  5. 31 0
      src/kernel/syscall.cpp
  6. 0 22
      src/kernel/vfs.cpp

+ 1 - 0
CMakeLists.txt

@@ -137,6 +137,7 @@ add_custom_target(boot.img
     COMMAND mcopy -i boot.img@@1M ${CMAKE_BINARY_DIR}/user-space-program/lazybox.out ::pwd
     COMMAND mcopy -i boot.img@@1M ${CMAKE_SOURCE_DIR}/busybox-minimal ::busybox_
     COMMAND mcopy -i boot.img@@1M ${CMAKE_SOURCE_DIR}/busybox ::busybox
+    COMMAND mcopy -i boot.img@@1M ${CMAKE_SOURCE_DIR}/init_script.sh ::initsh
 )
 
 add_custom_command(OUTPUT run

+ 3 - 3
include/kernel/vfs.hpp

@@ -12,14 +12,14 @@
 
 #include <types/path.hpp>
 
-#define NODE_MAJOR(node) ((node) >> 16)
-#define NODE_MINOR(node) ((node) & 0xffffU)
+#define NODE_MAJOR(node) (((node) >> 8) & 0xFFU)
+#define NODE_MINOR(node) ((node) & 0xFFU)
 
 namespace fs {
 
 constexpr dev_t make_device(uint32_t major, uint32_t minor)
 {
-    return (major << 16) | (minor & 0xffff);
+    return ((major << 8) & 0xFF00U) | (minor & 0xFFU);
 }
 
 // buf, buf_size, offset, cnt

+ 24 - 0
init_script.sh

@@ -0,0 +1,24 @@
+#!/mnt/busybox sh
+
+BUSYBOX=/mnt/busybox
+alias mkdir="$BUSYBOX mkdir "
+alias mknod="$BUSYBOX mknod "
+alias cat="$BUSYBOX cat "
+
+mkdir -p /etc
+mkdir -p /root
+mkdir -p /dev
+
+mknod -m 666 /dev/console c 2 0
+mknod -m 666 /dev/null c 1 0
+
+cat > /etc/passwd <<EOF
+root:x:0:0:root:/root:/mnt/busybox_ sh
+EOF
+
+cat > /etc/group <<EOF
+root:x:0:root
+EOF
+
+exec /mnt/init /mnt/busybox_ sh \
+    < /dev/console > /dev/console 2> /dev/console

+ 2 - 6
src/kernel/process.cpp

@@ -378,10 +378,6 @@ proclist::proclist()
     auto& thd = *init.thds.begin();
     thd.name.assign("[kernel init]");
 
-    init.files.open(init, "/dev/console", O_RDONLY, 0);
-    init.files.open(init, "/dev/console", O_WRONLY, 0);
-    init.files.open(init, "/dev/console", O_WRONLY, 0);
-
     current_process = &init;
     current_thread = &thd;
     readythds->push(current_thread);
@@ -565,8 +561,8 @@ void NORETURN _kernel_init(void)
     current_process->attr.system = 0;
     current_thread->attr.system = 0;
 
-    const char* argv[] = { "/mnt/busybox", "sh", "/init" };
-    const char* envp[] = { "LANG=C", "HOME=/", "PATH=/mnt", "PWD=/", nullptr };
+    const char* argv[] = { "/mnt/busybox", "sh", "/mnt/initsh" };
+    const char* envp[] = { "LANG=C", "HOME=/root", "PATH=/mnt", "PWD=/", nullptr };
 
     types::elf::elf32_load_data d;
     d.argv = argv;

+ 31 - 0
src/kernel/syscall.cpp

@@ -406,6 +406,10 @@ int _syscall_ioctl(interrupt_stack* data)
     case TIOCGPGRP: {
         SYSCALL_ARG3(pid_t*, pgid);
         tty* ctrl_tty = current_process->control_tty;
+
+        if (!ctrl_tty)
+            return -ENOTTY;
+
         // TODO: copy_to_user
         *pgid = ctrl_tty->get_pgrp();
         break;
@@ -414,6 +418,10 @@ int _syscall_ioctl(interrupt_stack* data)
         // TODO: copy_from_user
         SYSCALL_ARG3(const pid_t*, pgid);
         tty* ctrl_tty = current_process->control_tty;
+
+        if (!ctrl_tty)
+            return -ENOTTY;
+
         ctrl_tty->set_pgrp(*pgid);
         break;
     }
@@ -996,6 +1004,28 @@ int _syscall_access(interrupt_stack* data)
     }
 }
 
+int _syscall_mknod(interrupt_stack* data)
+{
+    SYSCALL_ARG1(const char* __user, pathname);
+    SYSCALL_ARG2(mode_t, mode);
+    SYSCALL_ARG3(dev_t, dev);
+
+    auto path = types::make_path(pathname, current_process->pwd);
+    auto* dent = fs::vfs_open(*current_process->root, path);
+
+    if (dent)
+        return -EEXIST;
+
+    auto filename = path.last_name();
+    path.remove_last();
+
+    dent = fs::vfs_open(*current_process->root, path);
+    if (!dent)
+        return -ENOENT;
+
+    return fs::vfs_mknode(dent, filename.c_str(), mode, dev);
+}
+
 extern "C" void syscall_entry(
     interrupt_stack* data,
     mmx_registers* mmxregs)
@@ -1035,6 +1065,7 @@ void init_syscall(void)
     syscall_handlers[0x0a] = _syscall_unlink;
     syscall_handlers[0x0b] = _syscall_execve;
     syscall_handlers[0x0c] = _syscall_chdir;
+    syscall_handlers[0x0e] = _syscall_mknod;
     syscall_handlers[0x14] = _syscall_getpid;
     syscall_handlers[0x21] = _syscall_access;
     syscall_handlers[0x25] = _syscall_kill;

+ 0 - 22
src/kernel/vfs.cpp

@@ -824,26 +824,4 @@ void init_vfs(void)
 
     vfs_mkdir(fs_root, "dev", 0755);
     vfs_mkdir(fs_root, "mnt", 0755);
-    vfs_mkfile(fs_root, "init", 0755);
-
-    auto* init = vfs_open(*fs_root, "/init");
-    assert(init);
-    const char* str = "#!/mnt/busybox sh\n"
-                      "cd /\n"
-                      "busybox mkdir etc\n"
-                      "busybox mkdir root\n"
-                      "busybox cat > /etc/passwd <<EOF\n"
-                      "root:x:0:0:root:/root:/mnt/busybox_ sh\n"
-                      "EOF\n"
-                      "busybox cat > /etc/group <<EOF\n"
-                      "root:x:0:root\n"
-                      "EOF\n"
-                      "exec /mnt/init /mnt/busybox_ sh < /dev/console"
-                      "    >> /dev/console 2>>/dev/console\n";
-    vfs_write(init->ind, str, 0, strlen(str));
-
-    auto* dev = vfs_open(*fs_root, "/dev");
-    assert(dev);
-    vfs_mknode(dev, "null", 0666 | S_IFCHR, make_device(1, 0));
-    vfs_mknode(dev, "console", 0666 | S_IFCHR, make_device(2, 0));
 }