2014-05-07 433 views
6

我試圖在Linux中編寫系統調用。我修改了unistd.hsyscall_32.tblsys.c分別如下在進行系統調用時出現'errno 38:function not implemented'

/* 
#define __NR3264_fadvise64 223 
__SC_COMP(__NR3264_fadvise64, sys_fadvise64_64, compat_sys_fadvise64_64) 
*/ 
#define __NR_zslhello 223 
__SYSCALL(__NR_zslhello, sys_zslhello) 

223 i386 zslhello sys_zslhello 

asmlinkage int sys_zslhello(int ret) 
{ 
    printk("Hello, my syscall!\n"); 
    return ret; 
} 

編譯內核後,我用syscall(223, 10000);,返回值是-1,而errno38,即功能未實現。你有什麼想法嗎?

+0

您是否將代碼編譯爲模塊?修改代碼後,你運行了'make'目標嗎?我也認爲這應該去StackOverflow,因爲這顯然是一個編程問題。 –

+0

@SamiLaine我在內核代碼中添加了一個系統調用,並編譯了內核。它不是一個單獨的模塊。 – zijuexiansheng

+0

爲什麼你會註釋掉'sys_fadvise64_64'?內核的其他部分可能依賴於這個....你應該把它編號爲$ last_syscall_number + 1.另外你可能會碰到系統是64位的事實,所以你應該改變'syscall_64.tbl'。 – fedepad

回答

3

這是因爲syscall未按顧名思義實施。可能在你的情況下,你的機器是64位的。所以你必須更改文件syscall_64.tbl而不是syscall_32.tbl

在其中共同的系統調用定義文件的最後一行添加一行

x common zslhello sys_zslhello 

x是1加在公共區域中的最後一個值。這是我的syscall_64.tbl片段的外觀。

330 common pkey_alloc  sys_pkey_alloc 
331 common pkey_free  sys_pkey_free 

# 
# x32-specific system call numbers start at 512 to avoid cache impact 
# for native 64-bit operation. 
# 
512 x32 rt_sigaction  compat_sys_rt_sigaction 
513 x32 rt_sigreturn  sys32_x32_rt_sigreturn 

在我的情況下x是332.乾杯!