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

+1 -1
View File
@@ -20,7 +20,7 @@ export def _start() -> int:
master: vpui.Tk* = &root
def _sdbg(msg: str):
_syscall._syscall1(uint64(18), uint64(msg))
_syscall._syscall1(uint64(_syscall.Syscall.SERIAL_PUTS), uint64(msg))
_sdbg("[term] start\n")
+6 -6
View File
@@ -2,11 +2,11 @@ import vpsdk.syscall as syscall
import t, c
export def log_info(msg: const str):
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64("[SerialLogger] "))
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64(msg))
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64("\n"))
syscall._syscall1(uint64(syscall.Syscall.SERIAL_PUTS), uint64("[SerialLogger] "))
syscall._syscall1(uint64(syscall.Syscall.SERIAL_PUTS), uint64(msg))
syscall._syscall1(uint64(syscall.Syscall.SERIAL_PUTS), uint64("\n"))
export def log_warn(msg: const str):
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64("[SerialLogger:WARN] "))
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64(msg))
syscall._syscall1(uint64(syscall.SERIAL_PUTS), uint64("\n"))
syscall._syscall1(uint64(syscall.Syscall.SERIAL_PUTS), uint64("[SerialLogger:WARN] "))
syscall._syscall1(uint64(syscall.Syscall.SERIAL_PUTS), uint64(msg))
syscall._syscall1(uint64(syscall.Syscall.SERIAL_PUTS), uint64("\n"))
+2 -2
View File
@@ -7,10 +7,10 @@ def color_rgb(r: uint8, g: uint8, b: uint8) -> uint32:
return uint32(r) | (uint32(g) << 8) | (uint32(b) << 16)
def get_winbuf(win_id: int) -> UINT32PTR:
return syscall._syscall2(uint64(syscall.GET_WINBUF), uint64(win_id), 0)
return syscall._syscall2(uint64(syscall.Syscall.GET_WINBUF), uint64(win_id), 0)
def win_flush(win_id: int):
syscall._syscall2(uint64(syscall.WIN_FLUSH), uint64(win_id), 0)
syscall._syscall2(uint64(syscall.Syscall.WIN_FLUSH), uint64(win_id), 0)
export def draw_pixel(buf: UINT32PTR, bw: int, x: int, y: int, color: uint32):
if x < 0 or y < 0: return
+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
+2 -2
View File
@@ -2,10 +2,10 @@ from . import syscall as syscall
def load_so(path: const str) -> uint64:
return syscall._syscall1(uint64(syscall.LOAD_SO), uint64(path))
return syscall._syscall1(uint64(syscall.Syscall.LOAD_SO), uint64(path))
def so_call1(sym_name: const str, arg1: rawptr) -> int:
# arg1 只是原样交给系统调用的裸地址,故用 rawptr(未定/通配指针)而非 t.CPtr:
# 后者是具体类型的一级指针,调用方传字符串字面量(二级指针)会被判成级数不符
# (CastError: pointer level differs, source level 2 -> target level 1)。
return int(syscall._syscall2(uint64(syscall.SO_CALL1), uint64(sym_name), uint64(arg1)))
return int(syscall._syscall2(uint64(syscall.Syscall.SO_CALL1), uint64(sym_name), uint64(arg1)))
+13 -13
View File
@@ -17,43 +17,43 @@ define DT_FILE = 1
define DT_DIR = 2
def open(path: const str, flags: uint32) -> int:
return int(syscall._syscall3(uint64(syscall.OPEN), uint64(path), uint64(flags), 0))
return int(syscall._syscall3(uint64(syscall.Syscall.OPEN), uint64(path), uint64(flags), 0))
def close(fd: int) -> int:
return int(syscall._syscall1(uint64(syscall.CLOSE), uint64(fd)))
return int(syscall._syscall1(uint64(syscall.Syscall.CLOSE), uint64(fd)))
def read(fd: int, buf: rawptr, count: uint32) -> int:
return int(syscall._syscall3(uint64(syscall.READ), uint64(fd), uint64(buf), uint64(count)))
return int(syscall._syscall3(uint64(syscall.Syscall.READ), uint64(fd), uint64(buf), uint64(count)))
def write(fd: int, buf: rawptr, count: uint32) -> int:
return int(syscall._syscall3(uint64(syscall.WRITE), uint64(fd), uint64(buf), uint64(count)))
return int(syscall._syscall3(uint64(syscall.Syscall.WRITE), uint64(fd), uint64(buf), uint64(count)))
def seek(fd: int, offset: uint32) -> int:
return int(syscall._syscall3(uint64(syscall.SEEK), uint64(fd), uint64(offset), 0))
return int(syscall._syscall3(uint64(syscall.Syscall.SEEK), uint64(fd), uint64(offset), 0))
def tell(fd: int) -> uint32:
return uint32(syscall._syscall1(uint64(syscall.TELL), uint64(fd)))
return uint32(syscall._syscall1(uint64(syscall.Syscall.TELL), uint64(fd)))
def fsize(fd: int) -> uint32:
return uint32(syscall._syscall1(uint64(syscall.SIZE), uint64(fd)))
return uint32(syscall._syscall1(uint64(syscall.Syscall.SIZE), uint64(fd)))
def mkdir(path: const str) -> int:
return int(syscall._syscall3(uint64(syscall.MKDIR), uint64(path), 0, 0))
return int(syscall._syscall3(uint64(syscall.Syscall.MKDIR), uint64(path), 0, 0))
def remove(path: const str) -> int:
return int(syscall._syscall3(uint64(syscall.REMOVE), uint64(path), 0, 0))
return int(syscall._syscall3(uint64(syscall.Syscall.REMOVE), uint64(path), 0, 0))
def opendir(path: const str) -> int:
return int(syscall._syscall3(uint64(syscall.OPENDIR), uint64(path), 0, 0))
return int(syscall._syscall3(uint64(syscall.Syscall.OPENDIR), uint64(path), 0, 0))
def readdir(dd: int, info: rawptr) -> int:
return int(syscall._syscall3(uint64(syscall.READDIR), uint64(dd), uint64(info), 0))
return int(syscall._syscall3(uint64(syscall.Syscall.READDIR), uint64(dd), uint64(info), 0))
def closedir(dd: int) -> int:
return int(syscall._syscall1(uint64(syscall.CLOSEDIR), uint64(dd)))
return int(syscall._syscall1(uint64(syscall.Syscall.CLOSEDIR), uint64(dd)))
def stat(path: const str, info: rawptr) -> int:
return int(syscall._syscall3(uint64(syscall.STAT), uint64(path), uint64(info), 0))
return int(syscall._syscall3(uint64(syscall.Syscall.STAT), uint64(path), uint64(info), 0))
class FileIO:
_fd: int
+5 -5
View File
@@ -2,20 +2,20 @@ from . import syscall as syscall
def exit(code: int):
syscall._syscall1(uint64(syscall.EXIT), uint64(code))
syscall._syscall1(uint64(syscall.Syscall.EXIT), uint64(code))
def thread_exit():
"""当前用户线程显式退出:内核回收其用户栈并标记线程结束(不返回)。"""
syscall._syscall0(uint64(syscall.THREAD_EXIT))
syscall._syscall0(uint64(syscall.Syscall.THREAD_EXIT))
def yield_cpu():
syscall._syscall2(uint64(syscall.WAIT_WINDOW), uint64(0), uint64(2))
syscall._syscall2(uint64(syscall.Syscall.WAIT_WINDOW), uint64(0), uint64(2))
def spawn(path: const str, blocking: int = 0) -> int:
return int(syscall._syscall2(uint64(syscall.SPAWN), uint64(path), uint64(blocking)))
return int(syscall._syscall2(uint64(syscall.Syscall.SPAWN), uint64(path), uint64(blocking)))
def thread_create(func: rawptr, arg: rawptr = None) -> int:
return int(syscall._syscall2(uint64(syscall.THREAD_CREATE), uint64(func), uint64(arg)))
return int(syscall._syscall2(uint64(syscall.Syscall.THREAD_CREATE), uint64(func), uint64(arg)))
class Thread:
+2 -2
View File
@@ -15,12 +15,12 @@ export def printf(fmt: const str, *args) -> int:
return 0
buf: [1024]char
n: int = viperlib.vsnprintf(&buf, 1024, fmt, args)
_syscall._syscall1(uint64(_syscall.SERIAL_PUTS), uint64(&buf))
_syscall._syscall1(uint64(_syscall.Syscall.SERIAL_PUTS), uint64(&buf))
return n
export def exit(status: int):
"""终止当前进程(EXIT syscall:销毁本进程窗口)"""
_syscall._syscall1(uint64(_syscall.EXIT), uint64(status))
_syscall._syscall1(uint64(_syscall.Syscall.EXIT), uint64(status))
export def fflush(stream: const rawptr) -> int:
+1 -1
View File
@@ -20,7 +20,7 @@ export def malloc(size: sizet) -> rawptr:
if _heap_inited == 0: _heap_init()
hdr_size: sizet = _heap_hdr.__sizeof__()
total: sizet = hdr_size + size
ptr: uint64 = _sc._syscall1(uint64(_sc.SYSCALL_MMAP), uint64(total))
ptr: uint64 = _sc._syscall1(uint64(_sc.Syscall.MMAP), uint64(total))
if ptr == 0: return None
# 块头必须落在**映射区内部**(映射起点 ptr 处),不能写 ptr - hdr_size:
# 那 8 字节在映射之外 —— 第一次 malloc 时 mmap 返回的正是用户堆起点 0x20000000,
+45 -38
View File
@@ -1,41 +1,48 @@
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
# SYSCALL_* 别名(vpsdk.stdlib 等模块引用;数值与内核 VKernel/intr/syscall.vp 一致)
define SYSCALL_MMAP = 29
# ============================================================================
# 系统调用号表(SDK 侧镜像)。**与 VKernel/Kernel/intr/syscall.vp 的同名 enum 逐条对应**:
# vpsdk 不允许依赖 VKernel,所以这里是一份必须手工同步的副本 —— 增删/改号/改名两边一起改。
# 编号口径:与 Linux x86-64 ABI 同名同号;Linux 有而我们未实现的留空不占号;
# 我们独有的能力不再新增 syscall,最终走 devfs 设备文件或下沉到用户层(见 0x1000+ 段的标注)。
# ============================================================================
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
def _syscall0(num: uint64) -> uint64:
ret: uint64
+1 -1
View File
@@ -54,7 +54,7 @@ _hex_tbl: [17]char = "0123456789ABCDEF"
_hex_buf: [20]char = "0000000000000000000"
def _serial_puts(s: const str):
_syscall._syscall1(uint64(_syscall.SERIAL_PUTS), uint64(s))
_syscall._syscall1(uint64(_syscall.Syscall.SERIAL_PUTS), uint64(s))
def _ptr_to_hex(val: uint64, buf: rawptr):
buf[0] = 48
+11 -11
View File
@@ -50,10 +50,10 @@ struct InputEvent:
_pad2: uint8
def create_window(x: int, y: int, w: int, h: int, title: const str, style: int) -> int:
return int(syscall._syscall6(uint64(syscall.CREATE_WINDOW), uint64(x), uint64(y), uint64(w), uint64(h), uint64(title), uint64(style)))
return int(syscall._syscall6(uint64(syscall.Syscall.CREATE_WINDOW), uint64(x), uint64(y), uint64(w), uint64(h), uint64(title), uint64(style)))
def draw_text(win_id: int, x: int, y: int, text: const str, color: uint32) -> int:
return int(syscall._syscall5(uint64(syscall.DRAW_TEXT), uint64(win_id), uint64(x), uint64(y), uint64(text), uint64(color)))
return int(syscall._syscall5(uint64(syscall.Syscall.DRAW_TEXT), uint64(win_id), uint64(x), uint64(y), uint64(text), uint64(color)))
# 每窗口一份**用户态**后备缓冲(stdlib.malloc → MMAP → 0x20000000 用户堆)。
# 旧实现用 GET_WINBUF 把内核窗口缓冲地址直接交给 app,那片页 U=0 → app 一画就 #PF(err=0x7);
@@ -73,32 +73,32 @@ def get_winbuf(win_id: int) -> uint32*:
return uint32*(_winbufs[win_id])
def get_win_size(win_id: int) -> int:
return int(syscall._syscall2(uint64(syscall.GET_WIN_SIZE), uint64(win_id), 0))
return int(syscall._syscall2(uint64(syscall.Syscall.GET_WIN_SIZE), uint64(win_id), 0))
def flush(win_id: int):
buf: uint32* = get_winbuf(win_id)
syscall._syscall3(uint64(syscall.WIN_FLUSH), uint64(win_id), uint64(buf))
syscall._syscall3(uint64(syscall.Syscall.WIN_FLUSH), uint64(win_id), uint64(buf))
def mainloop(win_id: int):
syscall._syscall1(uint64(syscall.WAIT_WINDOW), uint64(win_id))
syscall._syscall1(uint64(syscall.Syscall.WAIT_WINDOW), uint64(win_id))
def poll_event(evt: InputEvent*) -> int:
return int(syscall._syscall1(uint64(syscall.POLL_EVENT), uint64(evt)))
return int(syscall._syscall1(uint64(syscall.Syscall.POLL_EVENT), uint64(evt)))
def is_active(win_id: int) -> int:
return int(syscall._syscall2(uint64(syscall.WAIT_WINDOW), uint64(win_id), 1))
return int(syscall._syscall2(uint64(syscall.Syscall.WAIT_WINDOW), uint64(win_id), 1))
def set_cursor_type(win_id: int, cursor_t: int):
syscall._syscall2(uint64(syscall.SET_CURSOR), uint64(win_id), uint64(cursor_t))
syscall._syscall2(uint64(syscall.Syscall.SET_CURSOR), uint64(win_id), uint64(cursor_t))
def set_title(win_id: int, title: const str) -> int:
return int(syscall._syscall2(uint64(syscall.SET_TITLE), uint64(win_id), uint64(title)))
return int(syscall._syscall2(uint64(syscall.Syscall.SET_TITLE), uint64(win_id), uint64(title)))
def set_geometry(win_id: int, x: int, y: int, w: int, h: int) -> int:
return int(syscall._syscall5(uint64(syscall.SET_GEOMETRY), uint64(win_id), uint64(x), uint64(y), uint64(w), uint64(h)))
return int(syscall._syscall5(uint64(syscall.Syscall.SET_GEOMETRY), uint64(win_id), uint64(x), uint64(y), uint64(w), uint64(h)))
def set_resizable(win_id: int, rw: int, rh: int) -> int:
return int(syscall._syscall3(uint64(syscall.SET_RESIZABLE), uint64(win_id), uint64(rw), uint64(rh)))
return int(syscall._syscall3(uint64(syscall.Syscall.SET_RESIZABLE), uint64(win_id), uint64(rw), uint64(rh)))
#class Window:
# HWND: int