2011-09-13 7 views
12

Attualmente sto imparando sui sistemi operativi l'uso di trap per facilitare le chiamate di sistema all'interno del kernel Linux. Ho individuato la tabella delle trappole in traps.c e l'implementazione di molte trappole all'interno di entry.S.Implementazione di chiamate di sistema/trap all'interno del kernel Linux source

Tuttavia, mi viene richiesto di trovare un'implementazione di due chiamate di sistema nel kernel di Linux che utilizzano le trap per implementare una chiamata di sistema. Anche se riesco a trovare da soli la definizione delle trappole, non sono sicuro di quale sarebbe la "chiamata" a una di queste trappole all'interno del kernel. Pertanto, sto lottando per trovare un esempio di questo comportamento.

Prima che qualcuno chieda, sì, questo è compito.

Come nota, sto usando Github per sfogliare i sorgenti del kernel, in quanto kernel.org è giù: https://github.com/torvalds/linux/

+2

Il buon tipo di domanda dei compiti :) – James

+6

Utilizzare http://lxr.linux.no/ per cercare il sorgente di linux. Ti farà risparmiare un sacco di tempo;) – rumpel

+0

@rumpel: non ne ho mai sentito parlare .. sembra abbastanza semplice. c'è qualcosa di speciale qui che non è disponibile con vim + 'ctags'? –

risposta

0

sto incaricato di trovare un'implementazione di due chiamate di sistema del kernel di Linux che utilizzano trappole per implementare una chiamata di sistema

Ogni chiamata sistema utilizza una trappola (interrupt 0x80 se ricordo bene) quindi il bit "kernel" verrà attivata in PSW, e operazioni privilegiate sarà disponibile per il processore .

Come già menzionato, le chiamate di sistema sono specificate in Entry.S sotto sys_call_table: e iniziano tutte con il prefisso "sys".

è possibile trovare l'intestazione funzione di chiamata di sistema in: include/linux/syscalls.h, si può trovare qui: http://lxr.linux.no/#linux+v3.0.4/include/linux/syscalls.h

Usa LXR (come il commento di cui sopra sono già citata), in generale, al fine di sfoglia il codice sorgente.

In ogni caso, la funzione viene implementata utilizzando la SYSCALL_DEFINE1 o versioni othe della macro, vedere http://lxr.linux.no/#linux+v3.0.4/kernel/sys.c

+1

Ci sono anche fastcall che non richiedono un interrupt. Non sono sicuro di come sono implementati, quindi dovrai cercarlo su google, mi dispiace. – RedX

+0

@RedX Hai ragione in generale, ma sono abbastanza sicuro che le chiamate di sistema in Entry.S sotto 'sys_call_table' sono implementate con un interrupt (Dopo aver brevemente letto il codice) –

+2

@RedX Ci sono istruzioni SYSENTER/SYSEXIT in x86 che sono probabilmente ciò a cui stai pensando: http://articles.manugarg.com/systemcallinlinux2_6.html – SoapBox

0

Se siete alla ricerca di una chiamata di sistema vero e proprio, non un'implementazione di una chiamata di sistema, forse si vuole controlla alcune librerie C. Perché un kernel dovrebbe includere una chiamata di sistema? (Non sto parlando di un applicazione chiamata di sistema , sto parlando ad esempio una chdir chiamata effettiva per esempio. C'è un sistema di chiamata chdir, che è una richiesta per cambiare la directory e c'è un chdirimplementazione della chiamata di sistema che in realtà la modifica e deve trovarsi da qualche parte nel kernel). Ok, forse alcuni kernel includono anche alcuni syscalls, ma questa è un'altra storia :)

In ogni caso, se ho una domanda giusta, non stai cercando un'implementazione ma una chiamata vera e propria. GNU libc è troppo complicato per me, ma puoi provare a navigare nelle fonti dietlibc. Alcuni esempi:

chdir.S

syscalls.h

7

Per x86 lo SYCALL_VECTOR (0x80) interrupt viene utilizzato solo per kernel 32bit. È possibile visualizzare il layout vettoriale dell'interrupt in arch/x86/include/asm/irq_vectors.h.La funzione trap_init() dal traps.c è colui che imposta il gestore di trap definito entry_32.S:

set_system_trap_gate(SYSCALL_VECTOR, &system_call);

Per i kernel a 64 bit, il nuovo SYSENTER (Intel) o SYSCALL (AMD) intructions sono usato per motivi di prestazioni. La funzione syscall_init() da arch/x86/kernel/cpu/common.c imposta il "gestore" definito in entry_64.S e con lo stesso nome (system_call).

Per lo spazio degli utenti, è possibile dare un'occhiata a this page (un po 'obsoleto per i nomi di funzione/file).