sys: Refactor GDT initialization, enhance syscall handling, and improve user mode entry

Finally we got usermode working again, It took awhile but we got it done. A few things we did in this commit:

- Simplified GDT entry initialization in gdt.c for kernel and user segments.
- Fixed TSS structure for task switching.
- Implemented cr2 handling in a page fault.
- Enhanced user stack setup in usermode.c to return the correct RSP.
- Improved syscall implementation in syscall.c, including new syscall numbers.
- Updated syscall entry to correctly handle context switching and argument passing.
- Refactored init.c to demonstrate file operations using syscalls.
- Added new syscalls for file operations in syscalls.h.
- Modified VFS to handle leading slashes in paths correctly.

Signed-off-by: kaguya <vpshinomiya@protonmail.com>
This commit is contained in:
kaguya
2026-04-26 02:06:28 -04:00
parent 3b6e68bc16
commit e6e8b1209b
19 changed files with 263 additions and 266 deletions
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
+2 -7
View File
@@ -1,12 +1,7 @@
.section .text
.global _start
.global main
_start:
mov $1, %rax
mov $'H', %rdi
syscall
mov $1, %rax
mov $'i', %rdi
syscall
call main
1: jmp 1b
+5 -1
View File
@@ -1,5 +1,10 @@
#pragma once
#define SYS_READ 0
#define SYS_WRITE 1
#define SYS_OPEN 2
#define SYS_CLOSE 3
static inline long syscall(long num, long a1, long a2, long a3)
{
long ret;
@@ -8,7 +13,6 @@ static inline long syscall(long num, long a1, long a2, long a3)
"syscall"
: "=a"(ret)
: "a"(num), "D"(a1), "S"(a2), "d"(a3)
:
);
return ret;
+28 -4
View File
@@ -1,5 +1,7 @@
#include "../include/syscalls.h"
#define STDOUT 1
unsigned strlen(const char* str)
{
unsigned len = 0;
@@ -8,15 +10,37 @@ unsigned strlen(const char* str)
++len;
++str;
}
return len;
}
void main()
{
syscall(1, 'A', 0, 0);
syscall(1, 'B', 0, 0);
syscall(1, 'C', 0, 0);
const char* path = "/qwerty.txt";
const char* msg = "Suki Suki Daisuki Kekkon Shiyo, my honey!";
char buf[128];
// ── open file ─────────────────────────────
long fd = syscall(SYS_OPEN, (long)path, 0, 0);
// ── write message ─────────────────────────
syscall(SYS_WRITE, fd, (long)msg, strlen(msg));
// ── close ────────────────────────────────
syscall(SYS_CLOSE, fd, 0, 0);
// ── reopen ───────────────────────────────
fd = syscall(SYS_OPEN, (long)path, 0, 0);
// ── read into buffer ─────────────────────
long n = syscall(SYS_READ, fd, (long)buf, sizeof(buf));
// ── close ────────────────────────────────
syscall(SYS_CLOSE, fd, 0, 0);
// ── print buffer to stdout ───────────────
syscall(SYS_WRITE, STDOUT, (long)buf, n);
// ── done ────────────────────────────────
while (1);
}