【发布时间】:2016-07-12 16:36:05
【问题描述】:
我需要在 Linux 内核的一段代码部分中检索系统调用号。
我正在使用以下功能:
int sn = syscall_get_nr(current, task_pt_regs(current));
很遗憾,sn 始终等于 0。我正在使用 ARM 函数定义,因为我正在为 ARM 32 位编译内核。
这段代码是从/arch/arm/kernel/entry-common.S内部调用的,带有指令bl my_syscall_begin,见下sn-p:
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
【问题讨论】:
-
您在哪个函数中调用该代码?
-
我正在使用自定义版本的内核,我从 char *get_syscall_fname(void) 内部调用它
-
从哪里调用
get_syscall_fname()函数?你确定你是在系统调用上下文中做的吗?因为如果没有——0系统调用号码对我来说似乎足够合理。 -
来自 /arch/arm/kernel/entry-common.S 中的内核代码,位于 local_restart 标签处。 @SamProtsenko
标签: android linux-kernel system-calls