refactor(syscall): 调用号改用 enum 并全面对齐 Linux x86-64 ABI

内核 intr/syscall.vp 与 vpsdk/syscall.vp 各一份 1..34 的 define 表改为同名 enum Syscall。编号口径:与 Linux 同名同号;Linux 有而我们未实现的留空不占号(12 brk / 39 getpid / 84 rmdir / 217 getdents64 / 257 openat … 需要时按号补)。

15 个语义重合的调用直接用 Linux 号:READ 0 / WRITE 1 / OPEN 2 / CLOSE 3 / STAT 4 / SEEK 8 / MMAP 9 / MUNMAP 11 / YIELD 24 / THREAD_CREATE 56(≈clone) / SPAWN 59(≈execve) / THREAD_EXIT 60(exit) / MKDIR 83 / REMOVE 87 / EXIT 231(exit_group)。

其余 19 个(UI 11 个 + SERIAL_PUTS/TELL/SIZE/OPENDIR/READDIR/CLOSEDIR/LOAD_SO/SO_CALL1)暂放 0x1000 起的**临时私有段**,每条带迁移标注:私有能力最终不占 syscall 号、改走 devfs 设备文件;UI 11 个待用户态 explorer(图形壳)接管 framebuffer 与输入后删除。

内核派发链改 n == int(Syscall.X)(n 是 int/i64、成员是 i32,显式 int() 规避未证实的混合宽度比较);SDK 全部调用点统一为 syscall.Syscall.X;stdlib 的 SYSCALL_MMAP 别名并入 Syscall.MMAP;Terminal 里硬编码的 uint64(18) 改为常量。
This commit is contained in:
TermiNexus committed 2026-10-16 18:32:33 +08:00
1 parent 4e1be2be88
commit ca72ddbbf7
12 files changed
+171 -150

No files matched your search

+82 -68
View File
@@ -11,40 +11,54 @@ import paging.paging as paging
import execrunner.elf as elf
define CREATE_WINDOW = 1
define DRAW_TEXT = 2
define EXIT = 3
define OPEN = 4
define CLOSE = 5
define READ = 6
define WRITE = 7
define SEEK = 8
define TELL = 9
define SIZE = 10
define MKDIR = 11
define REMOVE = 12
define OPENDIR = 13
define READDIR = 14
define CLOSEDIR = 15
define STAT = 16
define WAIT_WINDOW = 17
define SERIAL_PUTS = 18
define LOAD_SO = 19
define SO_CALL1 = 20
define GET_WINBUF = 21
define WIN_FLUSH = 22
define POLL_EVENT = 23
define SET_CURSOR = 24
define YIELD = 25
define SET_TITLE = 26
define SET_GEOMETRY = 27
define SPAWN = 28
define MMAP = 29
define MUNMAP = 30
define SET_RESIZABLE = 31
define GET_WIN_SIZE = 32
define THREAD_CREATE = 33
define THREAD_EXIT = 34
# ============================================================================
# 系统调用号表(唯一权威来源)。与 Linux x86-64 ABI **同名同号**:
# · Linux 有同名调用 → 直接用它的号;Linux 有而我们未实现的**留空不占号**
# (12 brk / 39 getpid / 84 rmdir / 217 getdents64 / 257 openat … 需要时按号补上);
# · 我们独有的能力**不再新增 syscall**,一律走 devfs 设备文件(open/read/write)
# 或下沉到用户层(见下面「临时私有段」的逐条迁移标注)。
# 注意:vpsdk/syscall.vp 有一份逐字对应的镜像(vpsdk 不允许依赖 VKernel),
# 增删/改号/改名必须两边同步。
# ============================================================================
enum Syscall:
# ---- Linux 对齐段(号 = Linux x86-64 的号)----
READ = 0 # read(fd, buf, count)
WRITE = 1 # write(fd, buf, count)
OPEN = 2 # open(path, flags)
CLOSE = 3 # close(fd)
STAT = 4 # stat(path, info)(结构体仍是本系统的 fileinfo)
SEEK = 8 # lseek(fd, offset, whence)(whence 目前恒 0 = SEEK_SET)
MMAP = 9 # mmap(size) → VA(ABI 待向 Linux 的 addr/len/prot/flags/fd/off 靠拢)
MUNMAP = 11 # munmap(ptr, size)(目前空实现)
YIELD = 24 # sched_yield()
THREAD_CREATE = 56 # clone():建用户线程,返回 tid
SPAWN = 59 # execve():加载并运行新 ELF,返回 pid
THREAD_EXIT = 60 # exit():退役当前线程
MKDIR = 83 # mkdir(path)
REMOVE = 87 # unlink(path)
EXIT = 231 # exit_group():退役当前线程 + 拆掉本 pid 的窗口
# ---- 临时私有段(0x1000+):Linux 无对应,且**逐条都会被消掉** ----
# 目标形态:私有能力不占 syscall 号 → 改 devfs 设备文件;UI 11 个 → 由用户态
# explorer(图形壳)接管 framebuffer 与输入后删除。当前保留只为让现有 app 还能跑。
SERIAL_PUTS = 0x1000 # TODO(devfs):改为 write(/dev/serial0)
TELL = 0x1001 # TODO(linux):可由 lseek(fd, 0, SEEK_CUR) 表达
SIZE = 0x1002 # TODO(linux):可由 fstat 表达
OPENDIR = 0x1003 # TODO(linux):openat(O_DIRECTORY) + getdents64
READDIR = 0x1004 # TODO(linux):getdents64
CLOSEDIR = 0x1005 # TODO(linux):close
LOAD_SO = 0x1006 # TODO(用户层):动态库加载下沉
SO_CALL1 = 0x1007 # TODO(用户层):同上
WAIT_WINDOW = 0x1008 # TODO(explorer):UI
CREATE_WINDOW = 0x1009 # TODO(explorer):UI
DRAW_TEXT = 0x100A # TODO(explorer):UI
GET_WINBUF = 0x100B # TODO(explorer):UI
WIN_FLUSH = 0x100C # TODO(explorer):UI
POLL_EVENT = 0x100D # TODO(explorer):UI
SET_CURSOR = 0x100E # TODO(explorer):UI
SET_TITLE = 0x100F # TODO(explorer):UI
SET_GEOMETRY = 0x1010 # TODO(explorer):UI
SET_RESIZABLE = 0x1011 # TODO(explorer):UI
GET_WIN_SIZE = 0x1012 # TODO(explorer):UI
define IA32_EFER = 0xC0000080
define IA32_STAR = 0xC0000081
@@ -385,96 +399,96 @@ extern def syscall_entry()
export def syscall_handler(num: uint64, arg1: uint64, arg2: uint64, arg3: uint64, arg4: uint64, arg5: uint64, arg6: uint64) -> uint64:
n: int = int(num)
if n == CREATE_WINDOW:
if n == int(Syscall.CREATE_WINDOW):
title_ptr: str = str(arg5)
return uint64(CREATE_WINDOW(int(arg1), int(arg2), int(arg3), int(arg4), title_ptr, int(arg6)))
elif n == DRAW_TEXT:
elif n == int(Syscall.DRAW_TEXT):
text_ptr: str = str(arg4)
return uint64(DRAW_TEXT(int(arg1), int(arg2), int(arg3), text_ptr, uint32(arg5)))
elif n == EXIT:
elif n == int(Syscall.EXIT):
return uint64(EXIT(int(arg1)))
elif n == OPEN:
elif n == int(Syscall.OPEN):
path_ptr: str = str(arg1)
return uint64(OPEN(path_ptr, uint32(arg2)))
elif n == CLOSE:
elif n == int(Syscall.CLOSE):
return uint64(CLOSE(int(arg1)))
elif n == READ:
elif n == int(Syscall.READ):
buf_ptr: rawptr = rawptr(arg2)
return uint64(READ(int(arg1), buf_ptr, uint32(arg3)))
elif n == WRITE:
elif n == int(Syscall.WRITE):
buf_ptr: rawptr = rawptr(arg2)
return uint64(WRITE(int(arg1), buf_ptr, uint32(arg3)))
elif n == SEEK:
elif n == int(Syscall.SEEK):
return uint64(SEEK(int(arg1), uint32(arg2)))
elif n == TELL:
elif n == int(Syscall.TELL):
return uint64(TELL(int(arg1)))
elif n == SIZE:
elif n == int(Syscall.SIZE):
return uint64(fsize(int(arg1)))
elif n == MKDIR:
elif n == int(Syscall.MKDIR):
path_ptr: str = str(arg1)
return uint64(MKDIR(path_ptr))
elif n == REMOVE:
elif n == int(Syscall.REMOVE):
path_ptr: str = str(arg1)
return uint64(REMOVE(path_ptr))
elif n == OPENDIR:
elif n == int(Syscall.OPENDIR):
path_ptr: str = str(arg1)
return uint64(OPENdir(path_ptr))
elif n == READDIR:
elif n == int(Syscall.READDIR):
info_ptr: rawptr = rawptr(arg2)
return uint64(READdir(int(arg1), info_ptr))
elif n == CLOSEDIR:
elif n == int(Syscall.CLOSEDIR):
return uint64(CLOSEdir(int(arg1)))
elif n == STAT:
elif n == int(Syscall.STAT):
path_ptr: str = str(arg1)
info_ptr: rawptr = rawptr(arg2)
return uint64(STAT(path_ptr, info_ptr))
elif n == WAIT_WINDOW:
elif n == int(Syscall.WAIT_WINDOW):
if int(arg2) == 1:
return uint64(desktop.is_active(int(arg1)))
elif int(arg2) == 2:
sched.Scheduler.try_reschedule()
return 0
return uint64(WAIT_WINDOW(int(arg1)))
elif n == SERIAL_PUTS:
elif n == int(Syscall.SERIAL_PUTS):
str_ptr_sp: str = str(arg1)
return uint64(SERIAL_PUTS(str_ptr_sp))
elif n == LOAD_SO:
elif n == int(Syscall.LOAD_SO):
path_ptr_so: rawptr = rawptr(arg1)
return LOAD_SO(path_ptr_so)
elif n == SO_CALL1:
elif n == int(Syscall.SO_CALL1):
sym_ptr: rawptr = rawptr(arg1)
return uint64(SO_CALL1(sym_ptr, rawptr(arg2)))
elif n == GET_WINBUF:
elif n == int(Syscall.GET_WINBUF):
return GET_WINBUF(int(arg1))
elif n == WIN_FLUSH:
elif n == int(Syscall.WIN_FLUSH):
return uint64(WIN_FLUSH(int(arg1), rawptr(arg2)))
elif n == POLL_EVENT:
elif n == int(Syscall.POLL_EVENT):
buf_ptr_ev: rawptr = rawptr(arg1)
caller_pid_ev: int = process.current()
return uint64(desktop.poll_event(buf_ptr_ev, caller_pid_ev))
elif n == SET_CURSOR:
elif n == int(Syscall.SET_CURSOR):
desktop.set_cursor_type(int(arg1), int(arg2))
return 0
elif n == YIELD:
elif n == int(Syscall.YIELD):
sched.Scheduler.try_reschedule()
return 0
elif n == SET_TITLE:
elif n == int(Syscall.SET_TITLE):
title_ptr_st: rawptr = rawptr(arg2)
return uint64(desktop.set_title(int(arg1), title_ptr_st))
elif n == SET_GEOMETRY:
elif n == int(Syscall.SET_GEOMETRY):
return uint64(desktop.set_geometry(int(arg1), int(arg2), int(arg3), int(arg4), int(arg5)))
elif n == SET_RESIZABLE:
elif n == int(Syscall.SET_RESIZABLE):
return uint64(desktop.set_resizable(int(arg1), int(arg2), int(arg3)))
elif n == GET_WIN_SIZE:
elif n == int(Syscall.GET_WIN_SIZE):
return uint64(desktop.get_size(int(arg1)))
elif n == SPAWN:
elif n == int(Syscall.SPAWN):
path_ptr_sp: rawptr = rawptr(arg1)
return uint64(SPAWN(path_ptr_sp, int(arg2)))
elif n == MMAP:
elif n == int(Syscall.MMAP):
return MMAP(arg1)
elif n == MUNMAP:
elif n == int(Syscall.MUNMAP):
return uint64(MUNMAP(arg1, arg2))
elif n == THREAD_CREATE:
elif n == int(Syscall.THREAD_CREATE):
func_ptr: rawptr = rawptr(arg1)
arg_ptr: rawptr = rawptr(arg2)
cur_pid: int = process.current()
@@ -486,7 +500,7 @@ export def syscall_handler(num: uint64, arg1: uint64, arg2: uint64, arg3: uint64
if p:
p.addThread(th.tid)
return uint64(th.tid)
elif n == THREAD_EXIT:
elif n == int(Syscall.THREAD_EXIT):
# 用户线程显式退出(回收用户栈等资源后让出,永不返回)。
sched.Scheduler.exit_current_thread()
return 0