]> Zhao Yanbai Git Server - kernel.git/commitdiff
简单封装一下ring3的系统调用
authoracevest <zhaoyanbai@126.com>
Wed, 31 Dec 2025 03:43:07 +0000 (11:43 +0800)
committeracevest <zhaoyanbai@126.com>
Wed, 31 Dec 2025 03:43:07 +0000 (11:43 +0800)
include/syscall.h
kernel/ring3.S
kernel/syscall.c

index 43ed6d01de78d10de3934399f9a2145b9f69a786..86966afa524fbdf48bd29879313e6104a552f3cc 100644 (file)
@@ -51,6 +51,7 @@ int _syscall4(int nr, unsigned long a, unsigned long b, unsigned long c, unsigne
 #define SYSC_PAUSE (10)
 #define SYSC_TEST (11)
 #define SYSC_DEBUG (12)
+#define SYSC_RAND (13)
 #define SYSC_BAD_NR (SYSC_NUM - 1)
 
 #endif  //_SYSCALL_H
index 36a19c034f10ecfb8ac08c837a3fe2c9bceec5d6..b4dc9119fbcc6305f62d38b86af23473c4a07c58 100644 (file)
@@ -27,10 +27,28 @@ ring3_entry:
     nop
     nop
 
-    pushal
+    movl    $SYSC_RAND, %eax
+    call    ring3_syscall
 
-    movl    $7, %ebx
+
+    movl    %eax, %ecx
+    andl    $0x000000FF, %ecx
     movl    $SYSC_WAIT, %eax
+    call    ring3_syscall
+
+    nop
+    nop
+    jmp ring3_entry
+
+# eax 系统调用号
+# ecx 参数1
+ring3_syscall:
+    pushl   %ebp
+
+    pushl   %ebx
+    pushl   %edi
+
+    movl    %ecx, %ebx
     call    get_eip
 get_eip:
     # 这里popl取得的就是上一个call指令自动压入栈中的地址
@@ -41,8 +59,8 @@ get_eip:
 
     sysenter
 
-    popal
+    popl    %edi
+    popl    %ebx
+    popl    %ebp
 
-    nop
-    nop
-    jmp ring3_entry
+    ret
index c1f5c010172b7aa8d0ef91be97d10fc685234e99..b28c2135e5bc612af1623d9c63f5004f92413409 100644 (file)
@@ -72,6 +72,11 @@ int sysc_debug(unsigned int v) {
     return 0;
 }
 
+int sysc_rand() {
+    uint32_t rand = jiffies;
+    return (int)rand;
+}
+
 void init_sysc_handler_table() {
     int i;
     for (i = 0; i < SYSC_NUM; i++) sysc_handler_table[i] = (unsigned long)sysc_none;
@@ -94,7 +99,8 @@ void init_sysc_handler_table() {
     _sysc_(SYSC_PAUSE, sysc_pause);
     _sysc_(SYSC_TEST, sysc_test);
     _sysc_(SYSC_DEBUG, sysc_debug);
-    _sysc_(SYSC_BAD_NR, sysc_bad_nr)
+    _sysc_(SYSC_RAND, sysc_rand);
+    _sysc_(SYSC_BAD_NR, sysc_bad_nr);
 }
 
 int sysc_bad_nr() {