2009-08-30 3 views
7

Кто-нибудь знает, в чем разница между mmap(2) и mmap(3)? Раздел «Человек» 3 описывается как «В этой главе описываются все функции библиотеки, исключая библиотечные функции, описанные в главе 2, которые реализуют системные вызовы». Не выполняет mmap(3) системный вызов?mmap (2) vs mmap (3)

Чтение двух страниц руководства, я вижу, что mmap(2), кажется, принимает гораздо более широкое разнообразие флагов, чем mmap(3), и утверждает, что может отображать пространства ввода-вывода устройства. mmap(3) утверждает, что имеет возможность сопоставлять «объекты общей памяти» и «типизированные объекты памяти» в дополнение к файлам, но не упоминает ввода-вывода устройства.

Поскольку две функции имеют одно и то же имя, я даже не уверен, как я могу выбрать один, а не другой.

ответ

18

mmap(3) Предполагается, что POSIX function. Он должен во всех отношениях обеспечить саму семантику, которую POSIX предоставляет, даже если это отклоняется от того, что Linux делает «изначально». mmap(2) - это системный вызов и предоставляет все колокола и свистки, которые Линус считает важными. Функция библиотеки C, конечно же, реализована с использованием системного вызова.

Чтобы вызвать системный вызов буквально (минуя библиотеку C), вы можете использовать <sys/syscall.h>.

Фактическая реализация mmap (3) находится в C library. Как вы можете видеть, он обычно передает управление непосредственно в mmap (2), если только во время компиляции (glibc) в качестве «back-end» был выбран mmap2 (2).

+0

Спасибо, это было очень ясно. Спасибо также за указатель в исходное дерево библиотеки C. Хотя я выполняю довольно много работы на уровне ядра и драйвера, я редко нахожусь в пространстве пользователя для чего-то другого, кроме тестовых утилит, и я вообще не изучал источник glibc. Я вижу, что у меня отсутствует очень полезный подход к ряду вопросов. – EQvan