2009-08-30 4 views
7

Weiß jemand, was der Unterschied zwischen mmap(2) und mmap(3) ist? Man Abschnitt 3 wird wie folgt beschrieben: "Dieses Kapitel beschreibt alle Bibliotheksfunktionen mit Ausnahme der in Kapitel 2 beschriebenen Bibliotheksfunktionen, die Systemaufrufe implementieren." Führt mmap(3) keinen Systemaufruf aus?mmap (2) vs mmap (3)

Lesen der beiden man-Seiten, sehe ich, dass mmap(2) scheint eine viel breitere Palette von Flags als mmap(3) akzeptiert akzeptiert, und in der Lage, Gerät I/O-Räume abzubilden. mmap(3) behauptet, in der Lage zu sein, "shared memory objects" und "typed memory objects" zusätzlich zu Dateien abzubilden, erwähnt jedoch nicht die Geräte-E/A.

Da die beiden Funktionen den gleichen Namen haben, bin ich mir nicht einmal sicher, wie ich den einen und nicht den anderen wählen kann.

Antwort

18

mmap(3) soll die POSIX function sein. Es sollte in jeder Hinsicht genau die Semantik liefern, die POSIX vorschreibt, auch wenn das von dem abweicht, was Linux "nativ" macht. mmap(2) ist der Systemaufruf, und bietet alle Schnickschnack, die Linus als wichtig erachtet. Die C-Bibliotheksfunktion wird natürlich unter Verwendung des Systemaufrufs implementiert.

Um den Systemaufruf wörtlich (Umgehung der C-Bibliothek) aufzurufen, können Sie <sys/syscall.h> verwenden. Die tatsächliche Implementierung von mmap (3) kann in C library gefunden werden. Wie Sie sehen können, wird die Steuerung normalerweise direkt an mmap (2) übergeben, es sei denn, zur Kompilierungszeit (von glibc) wurde mmap2 (2) als "Back-End" ausgewählt.

+0

Danke, das war sehr klar. Danke auch für den Zeiger in den Quellbaum der C-Bibliothek. Obwohl ich auf Kernel- und Treiberebene ziemlich viel Arbeit verarbeite, stoße ich nur selten auf User-Bereiche für andere Tools als Test-Utilities und habe Glibc-Source überhaupt nicht untersucht. Ich sehe, dass mir eine sehr nützliche Herangehensweise an eine Reihe von Problemen fehlte. – EQvan