duckOS系统调用大全:40+核心接口如何连接用户程序与C++内核(附API参考)

📅 2026/8/24 11:54:45
duckOS系统调用大全:40+核心接口如何连接用户程序与C++内核(附API参考)
duckOS系统调用大全40核心接口如何连接用户程序与C内核附API参考【免费下载链接】duckOSAn x86 monolithic kernel and operating system written in modern C. Comes with in-house graphical applications and command line utilities, plus ports of existing software. And yes, it runs DOOM!项目地址: https://gitcode.com/gh_mirrors/du/duckOSduckOS 是一款用现代 C 编写的 x86 单体内核操作系统它的**系统调用System Call**是用户程序与内核之间唯一的合法通道。本文带你完整看懂 duckOS 的 91 个系统调用号、int 0x80中断如何触发内核、参数与返回值约定并附上一份按功能分类的 API 参考清单帮你快速定位每一个核心接口的实现源码。系统调用是什么用户程序与内核之间的门在 duckOS 中用户态程序比如终端里的ls、cat、dshshells无法直接访问硬盘、网卡或键盘。任何特权操作都必须向内核发起一次系统调用请求 打开/读写文件 → 走 VFS 虚拟文件系统 创建进程/线程、发送信号 → 走内核任务管理器 收发网络数据 → 走内核的 TCP/IP 栈好消息是duckOS 沿用了类 UNIX 的接口设计你在 Linux 上学到的read、write、fork、open在 duckOS 上几乎一一对应学习成本极低。duckOS 系统调用执行原理int 0x80 如何进入 C 内核整个调用链路可以拆成三步每一步都能在项目里找到对应源码第 1 步用户态触发中断。C 库通过内联汇编执行int $0x80调用号放入eax最多三个参数依次放入ebx、ecx、edx。核心实现在libraries/libc/sys/syscall.cstatic int __syscall_trap__(int call, int b, int c, int d) { int ret; asm volatile(int $0x80 :: a(call), b(b), c(c), d(d)); asm volatile(mov %%eax, %0 : r(ret)); return ret; }第 2 步内核汇编入口。中断向量 0x80 指向kernel/asm/syscall.s中的asm_syscall_handler它压栈保存现场、切换段寄存器后把执行权交给 C 侧的syscall_handler。第 3 步C 内核分发。kernel/syscall/syscall.cpp中的handle_syscall()用一个巨大的switch把调用号分发给Process类的sys_read()、sys_fork()、sys_socket()等方法——这就是现代 C 内核的直观体现系统调用最终都是对内核对象的成员函数调用。返回值约定内核统一返回负的错误码表示失败用户态__syscall辅助函数检测到负值后会自动设置errno并返回-1与 POSIX 习惯完全一致。duckOS 系统调用号速查表API 参考全部调用号集中定义在kernel/syscall/syscall_numbers.h共 91 个号位。按功能分类如下可对照内核目录kernel/syscall/下同名实现文件阅读进程与线程管理调用号名称作用实现文件1SYS_EXIT退出当前进程kernel/syscall/exit.cpp2SYS_FORK创建子进程kernel/syscall/fork.cpp6SYS_EXECVE替换进程映像执行新程序kernel/syscall/exec.cpp12SYS_KILL向进程发送信号kernel/syscall/kill.cpp13 / 62SYS_GETPID/SYS_GETPPID获取自身/父进程 PIDkernel/syscall/pid.cpp20SYS_WAITPID等待子进程结束kernel/syscall/waitpid.cpp69SYS_SLEEP睡眠指定时间kernel/syscall/sleep.cpp70 / 71 / 72 / 73线程四件套创建线程、获取 TID、等待线程、线程退出kernel/syscall/thread.cpp91SYS_YIELD主动让出 CPUkernel/syscall/syscall.cpp 进程是笼子线程共享同一个笼子的地址空间——fork exec是 duckOS 上启动新应用的标准姿势。文件与目录操作调用号名称作用3 / 4SYS_READ/SYS_WRITE读写文件描述符7 / 8SYS_OPEN/SYS_CLOSE打开/关闭文件9 / 10 / 33SYS_FSTAT/SYS_STAT/SYS_LSTAT查询文件元信息11SYS_LSEEK移动读写偏移15 / 19SYS_UNLINK/SYS_LINK删除文件、创建硬链接21 / 22 / 23SYS_READDIR/SYS_CHDIR/SYS_GETCWD目录遍历与路径管理25 / 26 / 27SYS_RMDIR/SYS_MKDIR/SYS_MKDIRAT目录创建与删除28 / 29SYS_TRUNCATE/SYS_FTRUNCATE调整文件大小34–37SYS_SYMLINK系列 /SYS_READLINK系列符号链接操作30 / 31 / 32SYS_PIPE/SYS_DUP/SYS_DUP2管道与文件描述符复制53–58SYS_UMASK/SYS_CHMOD/SYS_CHOWN系列权限与属主管理文件类调用的读写核心在kernel/syscall/read_write.cpp目录类在kernel/syscall/mkdir.cpp、kernel/syscall/getcwd.cpp等每个文件都很短非常适合逐行精读。内存与共享内存调用号名称作用59 / 60SYS_MMAP/SYS_MUNMAP内存映射/解除映射63–66SYS_SHM*系列进程间共享内存创建、附加、分离、授权76SYS_MPROTECT修改内存页保护属性SYS_MMAP直接对接内核的 VMRegion/VMObject 虚拟内存体系源码见kernel/memory/目录是 duckOS 实现动态链接和文件映射的基础。网络与套接字调用号名称作用79SYS_SOCKET创建套接字80 / 86SYS_BIND/SYS_CONNECT绑定地址 / 发起连接83 / 84SYS_RECVMSG/SYS_SENDMSG收发数据87 / 89SYS_LISTEN/SYS_ACCEPT监听与接受连接81 / 82SYS_SETSOCKOPT/SYS_GETSOCKOPT套接字选项85SYS_GETIFADDRS获取网络接口地址88SYS_SHUTDOWN半关闭连接网络调用入口在kernel/syscall/socket.cpp底层对接kernel/net/目录下的 IP/TCP/UDP 协议栈实现。系统杂项调用号名称作用16SYS_GETTIMEOFDAY获取当前时间17SYS_SIGACTION注册信号处理函数18SYS_ISATTY判断描述符是否为终端61SYS_IOCTL设备控制键盘、终端等67SYS_POLL多路 I/O 事件等待77SYS_UNAME获取系统信息uname78SYS_PTRACE进程跟踪调试器/性能分析器的基石90SYS_FUTEX快速用户空间互斥量实战视角一条echo hello背后发生了什么以 duckOS 自带 shelldsh为例源码位于programs/dsh/执行echo hello hi.txt时依次发生fork()→SYS_FORK克隆出子进程子进程open(hi.txt, O_WRONLY|O_CREAT)→SYS_OPEN经 VFS 在 ext2 根文件系统中创建 inodewrite(fd, hello, 5)→SYS_WRITE将缓冲区数据写入页缓存close(fd)→SYS_CLOSE释放文件描述符exit(0)→SYS_EXIT通知内核回收进程。这套流程与 Linux 完全同构——理解它你就理解了所有 UNIX 类操作系统的心脏。如何在 duckOS 中扩展一个新系统调用如果你想给 duckOS 加一个自己的接口只需四步在kernel/syscall/syscall_numbers.h末尾追加#define SYS_XXX 92新建kernel/syscall/xxx.cpp并在Process类中实现sys_xxx()在kernel/syscall/syscall.cpp的switch中新增一个case分支在用户态libraries/libc/中封装一个 C 函数参考libraries/libc/sys/futex.c的写法。构建与运行环境配置可参考项目根目录的INSTRUCTIONS.md和CONTRIBUTING.md。总结duckOS 用 91 个系统调用号、一条int 0x80指令就把用 C 写的现代内核与用户态程序严丝合缝地连接了起来。它的接口高度贴合 POSIX 习惯源码文件按调用一一对应拆分篇幅短小可读性极佳是学习操作系统系统调用机制的绝佳样本。从syscall_numbers.h这份清单出发配合kernel/syscall/目录逐个精读你很快就能掌握操作系统用户态 ↔ 内核态交互的全部细节。【免费下载链接】duckOSAn x86 monolithic kernel and operating system written in modern C. Comes with in-house graphical applications and command line utilities, plus ports of existing software. And yes, it runs DOOM!项目地址: https://gitcode.com/gh_mirrors/du/duckOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考