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?
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. –
@SamiLaine Ho aggiunto una chiamata di sistema nel codice del kernel e ho compilato il kernel. Non è un modulo separato. – zijuexiansheng
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