识别当前系统呼叫号码 - Linux Kernel 3.4 Android

时间:2016-07-12 16:36:06

标签: android linux-kernel system-calls

我需要在Linux内核的一段代码中检索系统调用号。

我正在使用以下功能:

int sn = syscall_get_nr(current, task_pt_regs(current));

不幸的是,sn总是等于0。我正在使用ARM函数定义,因为我正在为ARM 32bit编译内核。

此代码是使用instraction /arch/arm/kernel/entry-common.Sbl my_syscall_begin内部调用的,请参阅下面的代码段:

local_restart:
    ldr r10, [tsk, #TI_FLAGS]       @ check for syscall tracing
    stmdb   sp!, {r4, r5}           @ push fifth and sixth args

#ifdef CONFIG_SECCOMP
    tst r10, #_TIF_SECCOMP
    bne __sys_trace
#endif

    tst r10, #_TIF_SYSCALL_WORK     @ are we tracing syscalls?
    bne __sys_trace

#ifdef CONFIG_MY_CONFIG
    stmdb   sp!, {r0-r12}
    bl  my_syscall_begin
    ldmia   sp!, {r0-r12}
#endif

    cmp scno, #NR_syscalls      @ check upper syscall limit
    adr lr, BSYM(ret_fast_syscall)  @ return address
    ldrcc   pc, [tbl, scno, lsl #2]     @ call sys_* routine

1 个答案:

答案 0 :(得分:0)

就像在ARM 3.4内核上一样,syscall_get_nr仅在跟踪线程时返回有效的syscall号,否则始终返回0。取自此补丁:https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/321802。您可能需要更改该页面上显示的代码才能使其正常工作。