Ho risposto alla domanda ma non capisco bene la differenza tra chiamate di sistema e funzioni di libreria. Concettualmente, qual è la differenza tra i due?
Ho risposto alla domanda ma non capisco bene la differenza tra chiamate di sistema e funzioni di libreria. Concettualmente, qual è la differenza tra i due?
Risposte:
Concettualmente, una funzione di libreria fa parte del processo.
In fase di esecuzione, il codice eseguibile e il codice di tutte le librerie (come libc.so) da cui dipende, vengono collegati in un singolo processo. Pertanto, quando si chiama una funzione in tale libreria, viene eseguita come parte del processo, con le stesse risorse e privilegi. È la stessa idea di chiamare una funzione che hai scritto tu stesso (con possibili eccezioni come le funzioni PLT e / o trampolino, che puoi cercare se ti interessa).
Concettualmente, una chiamata di sistema è un'interfaccia speciale utilizzata per effettuare una chiamata dal proprio codice (che generalmente non è privilegiato) al kernel (che ha il diritto di intensificare i privilegi secondo necessità).
Ad esempio, vedi Linux man brk . Quando un programma C chiama malloc
per allocare memoria, chiama una funzione di libreria in glibc.
Se c'è già abbastanza spazio per l'allocazione all'interno del processo , può fare tutta la gestione dell'heap necessaria e restituire la memoria al chiamante.
Altrimenti, glibc ha bisogno di richiedere più memoria dal kernel: (probabilmente) chiama la brk
funzione glibc, che a sua volta chiama la brk
syscall. Solo una volta passato il controllo al kernel, tramite syscall, lo stato della memoria virtuale globale può essere modificato per riservare più memoria e mapparlo nello spazio degli indirizzi del processo.
Aggiungendo alla risposta inutile: le
funzioni della libreria sono più veloci delle chiamate di sistema e di solito non contengono considerazioni di autorizzazione / sicurezza, poiché sono in esecuzione con i privilegi del processo e la sua memoria.
I syscall, d'altra parte, poiché vengono eseguiti nel kernel, hanno accesso a tutto nel sistema e quindi devono controllare ciò che il processo di chiamata può fare quando li chiama (verificare che disponga delle autorizzazioni per aprire un file, per esempio), inoltre, poiché i syscalls sono nel kernel, chiamarli richiede un cambio di contesto nella CPU, che è un processo molto pesante rispetto alla semplice chiamata di una chiamata in libreria.
I syscall di solito si riflettono come utilizzo della CPU di sistema nei programmi di monitoraggio.
chiamata in libreria: richiama una subroutine collegata all'applicazione (includendo o aggiungendo una libreria).
chiamata di sistema: trasferisce il controllo al sistema operativo (utente-> proc sistema-> sistema operativo) e mette il processore in modalità privilegiata