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:
1 parent
4e1be2be88
commit
ca72ddbbf7
12 files changed
+171
-150
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user