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
相关产品推荐
相关产品推荐

