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

树莓派内核中找不到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架构的新版本内核为例:

  1. 实现系统调用函数
    在内核代码或自定义模块中编写系统调用的实现,注意使用asmlinkage修饰符:
    asmlinkage long sys_my_custom_syscall(int arg) {
        // 你的系统调用逻辑
        return arg * 2;
    }
    
  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)
    
  3. 更新系统调用表
    打开arch/arm/kernel/syscall_table.S,在对应位置添加系统调用函数的引用,位置要与你分配的编号对应:
    .long sys_my_custom_syscall
    
  4. 编译并刷入内核
    按照树莓派内核编译流程重新编译内核,将生成的镜像刷入设备后,即可在用户态通过syscall()函数或封装后的接口调用你的自定义系统调用。

注意:如果是树莓派4及以上使用的ARM64内核,对应路径改为arch/arm64/include/asm/unistd.h和arch/arm64/kernel/syscall_table.S,步骤逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:12:45