【问题标题】:How to obtain Linux syscall name from the syscall number?如何从系统调用号中获取 Linux 系统调用名称?
【发布时间】:2014-06-08 14:03:30
【问题描述】:

我需要将 Linux 系统调用号翻译成人类可读的名称。在内核 2.6.32 中,我从 /usr/include/asm/unistd_32.h 中的 _NR* 宏中提取名称,这很麻烦,但确实有效。现在我需要让它在内核 3.2.0 上工作,这个文件不再存在。

将 Linux 系统调用号映射为人类可读名称的最简单、最便携的方法是什么?例如。 1->退出,6->关闭等

【问题讨论】:

标签: c linux system-calls


【解决方案1】:
  1. 您可以在内核源代码目录中创建grep -rA3 'SYSCALL_DEFINE.\?(<syscallname>,' *(将<syscallname> 替换为您的实际系统调用)。
  2. 您可以man syscalls 并从那里开始查找。
  3. 检查 here 并耐心等待(在 cmets 中报告链接已损坏)
  4. This one seems to be working

【讨论】:

  • 该链接已失效,请检查是否有替代链接。
【解决方案2】:

文件<sys/syscall.h> 定义了很多SYS_ 宏(间接通过我系统上的bits/syscall.h)。例如:

#define SYS_eventfd __NR_eventfd
#define SYS_eventfd2 __NR_eventfd2
#define SYS_execve __NR_execve
#define SYS_exit __NR_exit
#define SYS_exit_group __NR_exit_group
#define SYS_faccessat __NR_faccessat

这就是你要找的吗?我不确定这是否是您问题的一部分,但您可以这样做:

switch(code) {
#define syscode_case(x) case x: return #x;
    syscode_case(SYS_eventfd);
    syscode_case(SYS_eventf2);
}

您仍然需要知道可用的宏有哪些,但您不需要知道实际值。

编辑:

我的消息来源是man 2 syscall,上面写着:

#include <sys/syscall.h>`   /* For SYS_xxx definitions

【讨论】:

  • @GrzegorzJakacki 这不是您要找的吗?宏名称是可移植的。
  • 谢谢。我知道我可以执行以下操作来获取 SYS_... 宏的列表:echo "#include&lt;sys/syscall.h&gt;" | gcc -dN -E - | awk '($1=="#define" &amp;&amp; $2~/^SYS_/){print $2}' 所以我可以找到 SYS_... 宏的列表。问题是通过 SYS_... 宏是否是将系统调用号映射到名称的最佳方式。我不清楚 SYS_... 和 _NR... 宏之间有什么区别?是否有可能某些系统调用不会被 SYS_... 宏覆盖?系统调用内核捕获之前 EAX 寄存器中的数字是否与 SYS_... 定义的值相同?
猜你喜欢
  • 2012-10-04
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 2016-03-02
  • 1970-01-01
  • 2017-12-12
相关资源
最近更新 更多