GNU/Linux >> Linux Esercitazione >  >> Linux

Che cosa sono le chiamate di sistema Linux e le funzioni di libreria?

I software per computer sono sviluppati per automatizzare alcune attività o risolvere alcuni problemi. In ogni caso, un software raggiunge l'obiettivo con l'aiuto della logica scritta dallo sviluppatore di quel software. Ogni logica richiede alcuni servizi come il calcolo della lunghezza di una stringa, l'apertura di un file ecc. I servizi standard sono forniti da alcune funzioni o chiamate fornite solo a questo scopo.

Come per il calcolo della lunghezza della stringa, ci esiste una funzione standard come strlen(), per aprire un file esistono funzioni come open() e fopen(). Chiamiamo queste funzioni come funzioni standard poiché qualsiasi applicazione può utilizzarle.

Queste funzioni standard possono essere classificate in due categorie principali:

  1. Chiamate di funzioni di libreria.
  2. Chiamate di funzioni di sistema.

In questo articolo cercheremo di discutere il concetto alla base delle chiamate di sistema e di biblioteca sotto forma di vari punti e, ove necessario, fornirò la differenza tra i due.

1. Funzioni di libreria vs chiamate di sistema

Le funzioni che fanno parte della libreria C standard sono note come funzioni di libreria. Ad esempio, le funzioni standard di manipolazione delle stringhe come strcmp(), strlen() ecc. sono tutte funzioni di libreria.

Le funzioni che cambiano la modalità di esecuzione del programma dalla modalità utente alla modalità kernel sono note come chiamate di sistema. Queste chiamate sono richieste nel caso in cui alcuni servizi siano richiesti dal programma dal kernel. Ad esempio, se vogliamo modificare la data e l'ora del sistema o se vogliamo creare un socket di rete, questi servizi possono essere forniti solo dal kernel e quindi questi casi richiedono chiamate di sistema. Ad esempio, socket() è una chiamata di sistema.

2. Perché abbiamo bisogno di chiamate di sistema?

Le chiamate di sistema fungono da punto di ingresso al kernel del sistema operativo. Ci sono alcune attività che possono essere eseguite solo se un processo è in esecuzione in modalità kernel. Esempi di queste attività possono essere l'interazione con l'hardware, ecc. Quindi, se un processo vuole eseguire questo tipo di attività, dovrebbe essere eseguito in modalità kernel, resa possibile dalle chiamate di sistema.

3. Tipi di funzioni della libreria

Le funzioni della libreria possono essere di due tipi:

  • Funzioni che non richiamano alcuna chiamata di sistema.
  • Funzioni che effettuano una chiamata di sistema.

Esistono funzioni di libreria che non effettuano alcuna chiamata di sistema. Ad esempio, le funzioni di manipolazione delle stringhe come strlen() ecc rientrano in questa categoria. Inoltre, ci sono funzioni di libreria che effettuano ulteriori chiamate di sistema, ad esempio la funzione fopen() che è una funzione di libreria standard ma utilizza internamente la chiamata di sistema open().

4. Interazione tra componenti

Il diagramma seguente mostra come le funzioni della libreria, le chiamate di sistema e il codice dell'applicazione interagiscono tra loro.


Il diagramma precedente chiarisce che il codice dell'applicazione può interagire con le funzioni della libreria o le chiamate di sistema. Inoltre, una funzione di libreria può anche chiamare la funzione di sistema dall'interno. Ma solo le chiamate di sistema hanno accesso al kernel che può accedere ulteriormente all'hardware del computer.

5. fopen() vs open()

Alcuni di noi potrebbero obiettare che perché abbiamo due funzioni per la stessa operazione, cioè l'apertura di un file?

Ebbene, la risposta a questa è il fatto che fopen() è una funzione di libreria che fornisce servizi di I/O bufferizzati per l'apertura di un file mentre open() è una chiamata di sistema che fornisce servizi di I/O non bufferizzati. Sebbene la funzione open() sia disponibile anche per l'utilizzo da parte delle applicazioni, ma l'applicazione dovrebbe evitare di utilizzarla direttamente.

In generale, se esiste una funzione di libreria corrispondente a una chiamata di sistema, le applicazioni dovrebbero utilizzare la funzione di libreria perché :

  • Le funzioni di libreria sono portabili, il che significa che un'applicazione che utilizza le funzioni di libreria standard verrà eseguita su tutti i sistemi. Mentre d'altra parte un'applicazione che si basa sulla chiamata di sistema corrispondente potrebbe non essere eseguita su tutti i sistemi poiché l'interfaccia della chiamata di sistema può variare da sistema a sistema.
  • A volte la funzione di libreria corrispondente riduce il carico della chiamata di sistema, risultando in passaggi non frequenti dalla modalità utente alla modalità kernel. Ad esempio, se esiste un'applicazione che legge i dati dal file molto frequentemente, l'uso di fread() invece di read() fornirebbe I/O bufferizzato, il che significa che non tutte le chiamate a fread() risulteranno in una chiamata alla chiamata di sistema read (). Fread() può leggere una porzione di dati più grande (di quella richiesta dall'utente) in una volta sola e quindi la successiva fread() non richiederà una chiamata alla funzione di sistema read().

6. malloc() è una chiamata di sistema?

Questo è uno dei malintesi molto popolari che le persone hanno. Mettiamo in chiaro che malloc() non è una chiamata di sistema. La chiamata di funzione malloc() è una chiamata di funzione di libreria che utilizza ulteriormente la chiamata di sistema brk() o sbrk() per l'allocazione della memoria.

7. Chiamate di sistema:cambio modalità di esecuzione

Tradizionalmente, veniva utilizzato il meccanismo per sollevare un interrupt di 'int $0x80' al kernel. Dopo aver intercettato l'interrupt, il kernel lo elabora e cambia la modalità di esecuzione dalla modalità utente alla modalità kernel. Oggi, le istruzioni sysenter/sysexit vengono utilizzate per cambiare la modalità di esecuzione.

8. Alcune altre differenze

Oltre a quanto sopra, ecco alcune altre differenze tra una chiamata di sistema e una libreria:

  • Una funzione di libreria è collegata al programma utente ed è eseguita nello spazio utente mentre una chiamata di sistema non è collegata a un programma utente ed è eseguita nello spazio del kernel.
  • Il tempo di esecuzione di una funzione di libreria viene conteggiato nel tempo a livello di utente mentre il tempo di esecuzione di una chiamata di sistema viene conteggiato come parte del tempo di sistema.
  • È possibile eseguire facilmente il debug delle funzioni della libreria utilizzando un debugger, mentre le chiamate di sistema non possono essere sottoposte a debug poiché vengono eseguite dal kernel.

Linux
  1. Comprensione delle chiamate di sistema su Linux con strace

  2. Qual è l'attuale runlevel del sistema Linux?

  3. Linux:monitoraggio a livello di sistema delle chiamate a una funzione di libreria?

  4. Qual è l'interfaccia per le chiamate di sistema ARM e dove è definita nel kernel Linux?

  5. Quali sono le chiamate al sistema operativo/sistema nativo di Windows e Linux effettuate da malloc()?

Kernel Linux e le sue funzioni

Storia di Unix e Linux

Che cos'è il file system Linux? Guida facile

Quali sono le convenzioni di chiamata per le chiamate di sistema UNIX e Linux (e le funzioni dello spazio utente) su i386 e x86-64

Qual è la differenza tra chiamata di sistema e chiamata di libreria?

Android - Su quale distribuzione Linux si basa Android?