2014-05-07 11 views
6

Sto provando a scrivere una chiamata di sistema in Linux. Ho modificato il unistd.h, syscall_32.tbl e sys.c come segue rispettivamente:Ottenere 'errno 38: funzione non implementata' mentre si effettua una chiamata di sistema

/* 
#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; 
} 

Dopo aver compilato il kernel, io uso syscall(223, 10000);, il valore di ritorno è -1, e il errno è 38, ovvero la funzione non è implementata. Hai qualche idea su questo?

+0

Stai compilando il codice come modulo? Gli obiettivi 'make' sono stati eseguiti dopo aver modificato il codice? Penso anche che questo dovrebbe andare a StackOverflow in quanto è chiaramente una domanda di programmazione. –

+0

@SamiLaine Ho aggiunto una chiamata di sistema nel codice del kernel e ho compilato il kernel. Non è un modulo separato. – zijuexiansheng

+0

Perché commentate 'sys_fadvise64_64'? Altre parti del kernel potrebbero fare affidamento su questo .... Dovreste averlo numerato $ last_syscall_number + 1. Inoltre potreste notare il fatto che il sistema è a 64 bit, quindi dovreste cambiare 'syscall_64.tbl'. – fedepad

risposta

3

Questo perché il syscall non è stato implementato come suggerisce il nome. Probabilmente nel tuo caso la tua macchina è a 64 bit. Quindi devi modificare il file syscall_64.tbl non syscall_32.tbl.

Nell'ultima riga del file in cui sono definite le chiamate di sistema comuni aggiungere una linea di

x common zslhello sys_zslhello 

Dove x è 1 più l'ultimo valore in area comune. Ecco come appare uno snippet del mio 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 

Nel mio caso x è 332. Saluti!

Problemi correlati