2009-08-30 20 views
7

Qualcuno sa qual è la differenza tra mmap(2) e mmap(3)? La sezione uomo 3 è descritta come "Questo capitolo descrive tutte le funzioni della libreria escluse le funzioni di libreria descritte nel capitolo 2, che implementano le chiamate di sistema." mmap(3) non esegue una chiamata di sistema?mmap (2) vs mmap (3)

Leggendo le due pagine man, vedo che mmap(2) sembra accettare una gamma molto più ampia di flag rispetto a mmap(3) e afferma di essere in grado di mappare gli spazi di I/O del dispositivo. mmap(3) afferma di essere in grado di mappare "oggetti di memoria condivisa" e "oggetti di memoria digitati" in aggiunta ai file, ma non menziona l'I/O del dispositivo.

Poiché le due funzioni hanno lo stesso nome, non sono nemmeno sicuro di come scegliere l'una piuttosto che l'altra.

risposta

18

mmap(3) deve essere il POSIX function. Dovrebbe a tutti gli effetti fornire la semantica stessa che POSIX richiede, anche se ciò si discosta da ciò che Linux fa "in modo nativo". mmap(2) è la chiamata di sistema e fornisce tutte le suonerie e i fischi che Linus considera importanti. La funzione di libreria C è, ovviamente, implementata utilizzando la chiamata di sistema.

Per richiamare letteralmente la chiamata di sistema (ignorando la libreria C), è possibile utilizzare <sys/syscall.h>.

L'effettiva implementazione di mmap (3) è disponibile nello C library. Come puoi vedere, solitamente trasferisce il controllo direttamente su mmap (2), a meno che, in fase di compilazione (di glibc), sia stato selezionato mmap2 (2) come "back-end".

+0

Grazie, è stato molto chiaro. Grazie anche per il puntatore nell'albero dei sorgenti della libreria C. Sebbene eseguo una discreta quantità di lavoro a livello di kernel e di driver, raramente riesco a trovare spazio utente per qualcosa di diverso dalle utilità di test, e non ho affatto esaminato la sorgente di glibc. Vedo che mi è mancato un approccio molto utile a una serie di problemi. – EQvan