我需要在Linux内核的一段代码中检索系统调用号。
我正在使用以下功能:
int sn = syscall_get_nr(current, task_pt_regs(current));
不幸的是,sn
总是等于0
。我正在使用ARM函数定义,因为我正在为ARM 32bit编译内核。
此代码是使用instraction /arch/arm/kernel/entry-common.S
从bl 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
答案 0 :(得分:0)
就像在ARM 3.4内核上一样,syscall_get_nr仅在跟踪线程时返回有效的syscall号,否则始终返回0。取自此补丁:https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/321802。您可能需要更改该页面上显示的代码才能使其正常工作。