فهرست منبع

feat(user): add syscall wrappers

greatbridf 2 سال پیش
والد
کامیت
cc9c4c4989
2فایلهای تغییر یافته به همراه60 افزوده شده و 12 حذف شده
  1. 45 0
      user-space-program/basic-lib.h
  2. 15 12
      user-space-program/init.c

+ 45 - 0
user-space-program/basic-lib.h

@@ -2,6 +2,11 @@ typedef __UINT32_TYPE__ uint32_t;
 typedef __UINT16_TYPE__ uint16_t;
 typedef __UINT8_TYPE__ uint8_t;
 
+typedef uint32_t pid_t;
+
+#define GNU_ATTRIBUTE(attr) __attribute__((attr))
+#define NORETURN GNU_ATTRIBUTE(noreturn)
+
 static inline uint32_t syscall(uint32_t num, uint32_t arg1, uint32_t arg2)
 {
     asm volatile(
@@ -15,3 +20,43 @@ static inline uint32_t syscall(uint32_t num, uint32_t arg1, uint32_t arg2)
         : "eax", "edx", "edi", "esi");
     return num;
 }
+
+static inline void NORETURN syscall_noreturn(uint32_t num, uint32_t arg1, uint32_t arg2)
+{
+    asm volatile(
+        "movl %1, %%edi\n"
+        "movl %2, %%esi\n"
+        "movl %3, %%eax\n"
+        "int $0x80\n"
+        "movl %%eax, %0"
+        : "=g"(num)
+        : "g"(arg1), "g"(arg2), "g"(num)
+        : "eax", "edx", "edi", "esi");
+    // crash
+    syscall_noreturn(0x05, 0, 0);
+}
+
+static inline int fork(void)
+{
+    return syscall(0x00, 0, 0);
+}
+static inline uint32_t write(const char* buf)
+{
+    return syscall(0x01, (uint32_t)buf, 0);
+}
+static inline void sleep(void)
+{
+    syscall(0x02, 0, 0);
+}
+static inline void NORETURN exec(const char* bin, const char** argv)
+{
+    syscall_noreturn(0x04, (uint32_t)bin, (uint32_t)argv);
+}
+static inline void NORETURN exit(int exit_code)
+{
+    syscall_noreturn(0x05, exit_code, 0);
+}
+static inline uint32_t wait(void)
+{
+    return syscall(0x06, 0, 0);
+}

+ 15 - 12
user-space-program/init.c

@@ -1,21 +1,24 @@
 #include "basic-lib.h"
 
-int main(void)
+int main(int argc, char** argv)
 {
+    for (int i = 0; i < argc; ++i)
+        write(argv[i]);
+
     const char* data = "Hello World from user space init\n";
-    syscall(0x01, (uint32_t)data, 0);
-    int ret = syscall(0x00, 0, 0);
+    write(data);
+    int ret = fork();
     if (ret == 0) {
-        const char* child = "child\n";
-        // write
-        syscall(0x01, (uint32_t)child, 0);
-        // exit
-        syscall(0x05, 255, 0);
+        write("child\n");
+        exit(255);
     } else {
-        const char* parent = "parent\n";
-        // write
-        syscall(0x01, (uint32_t)parent, 0);
-        for (;;) ;
+        write("parent\n");
+    }
+
+    for (;;) {
+        int code = wait();
+        (void)code;
+        code += 1000;
     }
     return 0;
 }