2014-05-07 8 views
6

Ich versuche, einen Systemaufruf in Linux zu schreiben. I die unistd.h modifiziert, syscall_32.tbl und sys.c wie folgt jeweils:Get 'errno 38: Funktion nicht implementiert' während eines Systemaufrufs

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

Nachdem der Kernel kompilieren, verwende ich syscall(223, 10000);, ist der Rückgabewert -1 und die errno ist 38, dh die Funktion ist nicht implementiert. Hast du irgendwelche Ideen dazu?

+0

Übersetzen Sie Ihren Code als Modul? Haben Sie 'Ziele' gemacht, nachdem Sie den Code geändert haben? Ich denke auch, dass dies zu StackOverflow gehen sollte, da es sich eindeutig um eine Programmierfrage handelt. –

+0

@SamiLaine Ich habe einen Systemaufruf im Kernel-Code hinzugefügt und den Kernel kompiliert. Es ist kein separates Modul. – zijuexiansheng

+0

Warum kommentieren Sie 'sys_fadvise64_64' aus? Andere Teile des Kernels könnten sich darauf verlassen .... Sie sollten es nummeriert $ last_syscall_number + 1 haben. Außerdem könnten Sie die Tatsache treffen, dass das System 64 Bit ist, also sollten Sie es ändern 'syscall_64.tbl'. – fedepad

Antwort

3

Dies ist, weil die syscall wurde nicht implementiert, wie der Name schon sagt. In Ihrem Fall ist Ihr Computer wahrscheinlich ein 64-Bit-Computer. Sie müssen also die Datei syscall_64.tbl nicht syscall_32.tbl ändern.

In der letzten Zeile der Datei, in dem gemeinsamen syscalls definiert eine Zeile

x common zslhello sys_zslhello 

Wo x 1 plus den letzten Wert im gemeinsamen Raum ist. So sieht ein Ausschnitt meiner syscall_64.tbl aus.

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 

In meinem Fall x ist 332. Prost!