2014-04-23 61 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和耐心