2015-04-23 20 views
8

Qualcuno può spiegare le differenze per questi due in linux? Si prega di andare il più profondamente possibile in ogni fase del sistema operativo.Qual è la differenza tra chiamata di sistema e chiamata di libreria?

+0

Sono l'unico a pensare che si tratti di una discarica per i compiti? –

+1

@ Martininames, questa è una domanda curiosa. Vorrei che il professore avesse dato questo compito quando ero nella classe OS. – drdot

risposta

9

Le chiamate di sistema a basso livello gestite dal kernel sono le chiamate di sistema.

La pagina man dice: chiama

2 Sistema (funzioni fornite dal kernel)

3 Chiamate alle librerie (funzioni all'interno librerie di programma)

Un immagine pittorica possono rendere clear:

enter image description here

e

enter image description here

+0

questo è troppo alto livello. Sto cercando ogni piccolo passo. – drdot

+0

@dannycrane: - Puoi controllare la wiki: http://en.wikipedia.org/wiki/System_call per andare più in dettaglio. –

+0

@dannycrane: - Posso darti un piccolo esempio come fopen() che è una chiamata Library e open() che è una chiamata di sistema. Ora diciamo che chiamate fopen() dal file di intestazione nel vostro programma C. Ora l'ambiente di programmazione chiamerà system open() dal kernel ed eseguirà il suo task di apertura file. Di nuovo dopo l'esecuzione, il flusso di controllo ritorna alla modalità utente. È possibile controllare FOPEN (3) e OPEN (2) della pagina man –

2

chiamate di sistema e chiamate di libreria sono simili in quanto sono previste per l'applicazione dall'ambiente. La differenza tra i due è che le chiamate di sistema sono implementate nel kernel, mentre le chiamate alle librerie sono implementate nello spazio utente. Per effettuare una chiamata di sistema, l'applicazione deve eseguire istruzioni speciali relative all'hardware e al sistema (di solito un'interruzione o un'istruzione speciale SYSENTER), che attiva il selettore di contesto e inoltra il controllo al kernel. Le chiamate alle librerie, d'altra parte, non differiscono dalle normali chiamate di funzione (l'unica differenza è che il codice non risiede nell'eseguibile principale ma nelle librerie condivise).

+0

Le chiamate alla libreria semplice sono in qualche modo (non in tutti i casi) un wrapper per le chiamate di sistema. –

+1

Per niente, ad es. 'strcmp' è una chiamata di libreria implementata completamente nello spazio utente, non chiamando alcun codice del kernel. D'altra parte, la libreria di sistema fornisce le funzioni di wrapper convienience per la maggior parte delle chiamate di sistema. –

4

Guardando il commento, fammi provare questo. Un servizio di sistema è una procedura che viene eseguita con privilegi elevati (in genere la modalità kernel). Tutto il resto è una chiamata alla biblioteca.

L'hardware sottostante fornisce un gate per le applicazioni utente per l'accesso alla modalità kernel. Il sistema operativo protegge questo gate per la sicurezza di base del sistema.

Fare un po 'di semplificazione qui --- un metodo comune utilizzato dai processori è che il processo inneschi esplicitamente un'eccezione (Intel ha un metodo SYSCALL alternativo).

Un sistema dispone di un set di vettori di interrupt/eccezione (procedure puntatore a gestore) per rispondere alle eccezioni o agli interrupt (ad esempio errore di pagina, divisione per zero). Il sistema definirà alcuni set di vettori (in genere quelli con numero basso) per le eccezioni e gli interrupt hardware. Tuttavia, di solito lasciano gli slot per il sistema operativo da utilizzare.

Un qualcosa di istruzioni del tipo:

INT #12 

attiverà esplicitamente un'eccezione e invocare la procedura di 12 ° nel vettore. Un sistema potrebbe consentire di simulare un'eccezione di divisione per zero facendo questo

Supponiamo che il sistema operativo utilizzi il vettore 123 per i servizi di sistema.

INT #123 

chiamerebbe un servizio di sistema. Un sistema potrebbe riservare un vettore separato per ciascun servizio di sistema oppure potrebbe usarne uno e inviarlo.

Così si dovrebbe fare qualcosa di simile:

MOVL #23, R0 
    INT #123 

Il valore 23 in Registrati 0 racconta il gestore di interrupt per invocare servizio di sistema # 23.

Così puoi vedere che tutto questo richiede un linguaggio assembly. Ciò che ogni sistema operativo fa è creare un wrapper che può essere chiamato come funzioni dai linguaggi di alto livello.

Questa è la sequenza di ciò che accade:

  1. Un utente chiama l'involucro denominato con parametri normali. Il wrapper imposta i registri e impila per il servizio di sistema.

  2. Il wrapper attiva l'eccezione che invia al servizio di sistema.

  3. Il servizio di sistema deve quindi controllare TUTTI i parametri. Questo è uno dei motivi per cui i servizi di sistema hanno un sovraccarico elevato. Le eccezioni nella modalità kernel causano schermate blu della morte. Se il servizio di sistema deve scrivere su un buffer fornito dall'utente, deve assicurarsi che ogni byte a cui scrive sia una memoria scrivibile.

  4. Il servizio di sistema fa tutto ciò che deve fare.

  5. Il servizio di sistema esegue un'istruzione hardware per restituire da un'eccezione o un'interruzione. Questo ritorna alla modalità utente e torna alla funzione wrapper.

  6. Il wrapper può decomprimere i parametri restituiti nei registri.

  7. Il wrapper restituisce al chiamante.

+0

perché nessuno lo ha mai revocato? –

0

Funzioni libreria è una funzione ordinaria che viene inserita nella raccolta di funzioni denominata libreria.

Le chiamate di sistema sono la richiesta al sistema operativo per il servizio.

Problemi correlati