You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux内核syscall_32/64.tbl系统调用号取值范围咨询

关于Linux内核syscall_32.tbl和syscall_64.tbl中系统调用编号的取值范围说明

刚好之前折腾过自定义系统调用,给你捋清楚这俩文件里编号的规则:

首先得明确:x86架构下的32位和64位系统调用编号空间是完全独立的,各自有自己的分配范围和约定:

  • 64位系统调用(syscall_64.tbl):

    • 常规可用编号从0开始往上,目前内核里实际用到的大概到4000左右,理论上可以用到4095(超过的话可能会触发内核的边界检查)
    • 0-255区间是给传统Unix/POSIX标准系统调用预留的(比如read、write这些基础调用),256以上则是Linux特有的扩展调用
    • 负数编号属于内核内部使用的特殊入口,用户态程序根本碰不到,不用管
  • 32位系统调用(syscall_32.tbl):

    • 编号范围一般是0到1023,现有内核里用到的大概到800上下
    • 和64位类似,低编号对应标准调用,高编号是Linux扩展
    • 这里的compat entry point字段是给64位内核兼容32位用户态程序用的,填的是64位内核中专门处理32位系统调用的函数入口

另外还有个重要细节:系统调用编号是架构相关的!你现在看的是x86架构的表,换成ARM、RISC-V这些架构,编号范围和分配逻辑会不一样。

如果你想确认当前内核里哪些编号被占用、可用范围是多少,最快的方式是看这几个地方:

  • 直接看内核源码里的头文件:arch/x86/include/asm/unistd_32.h(32位)和arch/x86/include/asm/unistd_64.h(64位),里面用宏定义了每个系统调用的编号,比如#define __NR_read 0
  • 内核构建完成后,会在include/generated/uapi/asm/unistd.h里自动生成汇总后的系统调用编号列表,这个文件里的内容是最准确的
  • 要是你想加自定义系统调用,选编号的时候尽量挑现有最大编号+1,或者找内核注释里标注的预留区域,千万别和已有的调用重复

最后补充一句:如果你的自定义调用需要支持32位程序在64位内核上运行,记得在syscall_32.tbl里也注册一遍,并且填对compat entry point字段。

内容的提问来源于stack exchange,提问作者Rom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:56:23