【问题标题】:Identifying current system call number - Linux Kernel 3.4 Android识别当前系统调用号 - Linux Kernel 3.4 Android
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-12-30
    • 1970-01-01
    • 2015-05-27
    • 2012-12-02
    • 2011-06-23
    • 2020-05-20
    • 1970-01-01
    • 2012-11-18
    • 2015-05-03
    相关资源
    最近更新 更多