syscall.sh: 全架构Linux系统调用查询与API
Show HN: I've updated my Linux System Call website and API

我更新了 syscall.sh 网站和 API,将 27 种架构的 Linux 系统调用表汇聚一堂。从 x64、arm64 到 riscv64 等主流及小众架构,涵盖 Linux 3.3 至 7.3 内核版本。每个调用都清晰展示编号、参数、寄存器及调用约定,并提供完整的历史变更记录。所有数据直接源自内核源码,确保准确性。开发者可通过网页浏览或调用 API 获取 JSON 格式数据,轻松查询任意内核版本下的系统调用细节,是系统编程和内核研究的得力助手。
所有数据直接源自内核源码,确保你看到的正是内核实际分发的系统调用编号与约定。
HN 评论区
48- db48x
这是个旁支话题,但我一直觉得内核应该为每个现有的通过指针接收以 null 结尾字符串的系统调用,提供一个完全相同的替代系统调用,只是改用指针、容量和长度来接收字符串。这对现代语言编写的程序来说将是一个巨大的福音。我总想着去搜索内核邮件列表,看看这个想法以前是否有人提出过,但就是没找到时间。
- ozgrakkurt
还建议使用类似这样的命令:
echo '#include <sys/syscall.h>' | gcc -E -dM -xc - | grep -i "read"
来获取你电脑上真实的数值,以确保无误。
LLM 好几次都给出了错误的数字或常量定义,但让它生成这样的命令并亲眼所见,每次都能奏效。
另外 Chromium 文档里也有个表格:
https://www.chromium.org/chromium-os/developer-library/refer...
如果能直接让该网站链接到系统调用编号,那就非常实用了。
- bkallus
在 x86_64 和 x32 架构上,系统调用号是放在 eax 寄存器里,而不是 rax。rax 的高 32 位会被忽略,可以是任意值。
- guitmz
我在最初发布这个网站时,也写了一个用于查询系统调用 API 的 CLI 工具。我觉得可以把代码整理一下,也公开出来。它使用了嵌入式数据集,所以不需要一直去查询 API 端点。
- wg0
这真是个极好的资源,我之前都不知道。不过有个问题跟上面的网站无关——既然 Linux API 是一样的,为什么系统调用会因架构而异?
还是说我把它和 C 标准库/POSIX 搞混了,误以为它们在所有地方都应该是一样的?