2013-07-15 3 views
6

Sto leggendo Linux Kernel Development di Robert Love e uno degli esercizi che fa è creare una chiamata di sistema (pagina 106). Il problema è che non riesco a trovare il file della tabella chiamate di sistema nella v3.9 per l'architettura x86_32. So che sta usando la versione 2.6.xx ma non so se quella versione funzionerà con la distribuzione che sto usando dato che è piuttosto vecchia quindi preferirei piuttosto la v3.9.Dov'è la tabella delle chiamate di sistema nel kernel di Linux?

Maggiori informazioni: L'esercizio di cui sto parlando è la seguente: Aggiungere una voce alla fine degli table.This chiamate di sistema che deve essere fatto per ogni architettura che supporta la chiamata di sistema (che, per la maggior parte chiama, sono tutte le architetture). La posizione del syscall nella tabella, che inizia da zero, è il suo numero di chiamata di sistema. Ad esempio, la decima voce nell'elenco è assegnata a syscall numero nove.

risolto utilizzando il seguente approccio: La tabella chiamata di sistema si trova in arch/x86/syscalls/syscall_32.tbl per l'architettura x86. Grazie a Sudip Mukherjee per il suo aiuto.

Un altro approccio è il seguente: http://lists.kernelnewbies.org/pipermail/kernelnewbies/2013-July/008598.html Grazie a Srinivas Ganji per il suo aiuto troppo.

+0

dove ha fatto si cerca esso? – mnagel

+0

Nel libro si dice che si trova nella entry.S ma per quanto ne so questo è stato modificato nelle ultime versioni.Così ho cercato in arch/x86/kernel dove ho trovato il file entry_32.S ma non ho trovato la tabella né – Iker

+0

Sembra che sia [qui] (http://lxr.linux.no /#linux+v3.9/arch/x86/ia32/syscall_ia32.c#L18) – levengli

risposta

6

Creare una cartella di prova in radice src: src/linux-3.4/testing/, poi mettere all'interno di questa cartella:
- un file che contiene il codice syscall: strcpy.c

#include <linux/linkage.h> 
#include <linux/kernel.h> 
asmlinkage long sys_strcpy(char *dest, char *src) 
{ 
    int i=0; 
    while(src[i]!='\0') { 
     dest[i]=src[i++]; 
    } 
    dest[i]='\0'; 
    printk(" Done it "); 
    return 0; 
} 

e il Makefile che contiene solo la seguente riga:

obj-y:=strcpy.o 

Aggiungere una voce alla tabella syscall e il prototipo della funzione:
- modificare il file src/linux-3.4/arch/x86/syscalls/syscall_32.tbl b y aggiungendo questa riga alla voce 223 che è libera

223  i386 strcpy   sys_strcpy 

Modificare il file src/linux-3.4/include/linux/syscalls.h aggiungendo il prototipo della funzione

asmlinkage long sys_strcpy(char *dest, char *src); 

Modifica il principale Makefile nella radice src (src/linux-3.4/Makefile) aggiungendo la testare cartella creata prima, come segue:

core-y  += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ testing/ 
8

da kernel Linux 4.2, la tabella di chiamata di sistema è stata spostata da arch/x86/syscalls/syscall_64.tbl t o arch/x86/entry/syscalls/syscall_64.tbl

Ecco il corrispondente commit:

commit 1f57d5d85ba7f1f467173ff33f51d01a91f9aaf1 
Author: Ingo Molnar <[email protected]> 
Date: Wed Jun 3 18:36:41 2015 +0200 

    x86/asm/entry: Move the arch/x86/syscalls/ definitions to arch/x86/entry/syscalls/ 

    The build time generated syscall definitions are entry code related, move 
    them into the arch/x86/entry/ directory.