2014-04-23 132 views
4

我需要将Linux系统调用号码转换为人类可读的名称。在内核2.6.32中,我从/usr/include/asm/unistd_32.h中的__NR_ *宏中提取了这些名字,这很冒险,但它工作正常。现在我需要使它在内核3.2.0上工作,并且此文件不再存在。如何从系统调用号码获取Linux系统调用名称?

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

+0

没有程序化的方式来做到这一点,我知道。只有内核源代码中的digginig。 [此文件包含系统调用号码](http://lxr.linux.no/linux+v3.2/arch/x86/include/asm/unistd_64.h) – Dabo

回答

1

文件<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 
+0

@GrzegorzJakacki这不是你正在寻找的?宏名称是可移植的。 –

+0

谢谢。我知道我可以通过以下操作获取SYS _...宏的列表: 'echo“#include ”| gcc -dN -E - | awk'($ 1 ==“#define”&& $ 2〜/^SYS _ /){print $ 2}'' 所以我可以找到SYS _...宏的列表。问题是,通过SYS _...宏是否是将系统调用号码映射到名称的最佳方式。我不清楚SYS _...和__NR _...宏之间的区别是什么? SYS _...宏可能不包含某些系统调用吗?在syscall内核陷入与SYS _...定义的值相同的值之前,EAX寄存器中的数字是否存在? –

0
  1. 你可以在你的内核源代码目录grep -rA3 'SYSCALL_DEFINE.\?(<syscallname>,' *(替代<syscallname>与实际的系统调用)。
  2. 你可以man syscalls并从那里开始寻找。
  3. 检查here和耐心