2012-04-13 29 views

risposta

29

Avrete bisogno delle fonti del kernel di Linux per vedere la vera fonte delle chiamate di sistema. Le pagine di manuale, se installate sul sistema locale, contengono solo la documentazione delle chiamate e non la loro stessa fonte.

Sfortunatamente, le chiamate di sistema non vengono memorizzate in una posizione particolare nell'intero albero del kernel. Questo perché varie chiamate di sistema possono fare riferimento a diverse parti del sistema (gestione dei processi, gestione del filesystem, ecc.) E quindi sarebbe impossibile memorizzarle separatamente dalla parte dell'albero relativa a quella particolare parte del sistema.

La cosa migliore che puoi fare è cercare la macro SYSCALL_DEFINE[0-6]. Viene utilizzato (ovviamente) per definire il blocco di codice indicato come una chiamata di sistema. Ad esempio, fs/ioctl.c ha il codice seguente:

SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) 
{ 
/* do freaky ioctl stuff */ 
} 

Tale definizione significa che la syscall ioctl è dichiarata e prende tre argomenti. Il numero accanto allo SYSCALL_DEFINE indica il numero di argomenti. Per esempio, nel caso di getpid(void), ha dichiarato in kernel/timer.c, abbiamo il seguente codice:

SYSCALL_DEFINE0(getpid) 
{ 
     return task_tgid_vnr(current); 
} 

speranza che cancella le cose un po '.

2

Dal punto di vista di un'applicazione, uno system call è un'operazione elementare e atomica eseguita dallo kernel.

Il Assembly Howto spiega cosa sta succedendo, in termini di istruzione della macchina.

Ovviamente, il kernel sta facendo un sacco di cose quando gestisce un syscall.

In realtà, si potrebbe quasi credere che l'intero codice del kernel sia dedicato a gestire tutte le chiamate di sistema (questo non è completamente vero, ma quasi, dal punto di vista delle applicazioni, il kernel è visibile solo attraverso le chiamate di sistema). L'altro answer di Daniel Kamil Kozar sta spiegando quale funzione del kernel sta iniziando la gestione di alcune chiamate di sistema (ma molto spesso, molte altre parti del kernel partecipano indirettamente alle chiamate di sistema, ad esempio lo scheduler partecipa indirettamente all'implementazione di fork perché gestisce il processo figlio creato da un riuscito syscall fork).

1

Lo so che è vecchio, ma ero alla ricerca per la fonte per _system_call() troppo ed ho trovato questo bocconcino

codice vero e proprio per il punto di ingresso system_call può essere trovato in/usr/src/linux/kernel/sys_call. S Il codice reale per molte delle chiamate di sistema può essere trovato in /usr/src/linux/kernel/sys.c, e il resto viene trovato altrove. trova è tuo amico.

Presumo che questo è datato, perché non ho nemmeno quel file. Tuttavia, grep ha trovato ENTRY(system_call) in arch/x86/kernel/entry_64.S e sembra essere la cosa che chiama le singole chiamate di sistema. Al momento non sono attivo sulla mia intel-syntax x86 asm, quindi dovrai cercare e vedere se questo è ciò che volevi.

+0

'entry_64.S' non esiste più nella linea principale 4.8. – sherrellbc

Problemi correlati