树莓派内核中找不到arch/arm/kernel/calls.S,如何注册系统调用?
树莓派ARM内核注册系统调用问题解决
关于calls.S文件的位置
树莓派Linux内核中,arch/arm/kernel/calls.S仅存在于较老的内核分支(如rpi-4.19.y及更早版本)。新版本内核(5.x及以后)已将系统调用表的定义拆分到以下位置:
- 系统调用号定义:
arch/arm/include/asm/unistd.h - 系统调用表实现:
arch/arm/kernel/syscall_table.S
如果需要找到旧版的calls.S,只需切换到对应老版本的内核分支即可。
无calls.S时注册系统调用的步骤
以ARM32架构的新版本内核为例:
- 实现系统调用函数
在内核代码或自定义模块中编写系统调用的实现,注意使用asmlinkage修饰符:asmlinkage long sys_my_custom_syscall(int arg) { // 你的系统调用逻辑 return arg * 2; } - 分配系统调用号
打开arch/arm/include/asm/unistd.h,在文件末尾添加新的系统调用号,确保编号不与现有条目冲突:#define __NR_my_custom_syscall (__NR_SYSCALL_BASE + 390) // 示例编号,根据实际调整 __SYSCALL(__NR_my_custom_syscall, sys_my_custom_syscall) - 更新系统调用表
打开arch/arm/kernel/syscall_table.S,在对应位置添加系统调用函数的引用,位置要与你分配的编号对应:.long sys_my_custom_syscall - 编译并刷入内核
按照树莓派内核编译流程重新编译内核,将生成的镜像刷入设备后,即可在用户态通过syscall()函数或封装后的接口调用你的自定义系统调用。
注意:如果是树莓派4及以上使用的ARM64内核,对应路径改为
arch/arm64/include/asm/unistd.h和arch/arm64/kernel/syscall_table.S,步骤逻辑一致。
内容的提问来源于stack exchange,提问作者kwonryul
相关产品推荐
相关产品推荐

