В чем различия между системным вызовом linux mmap (2) и функцией posix mmap (3)? - PullRequest
0 голосов
/ 24 апреля 2020

В чем различия между linux системным вызовом mmap (2) и функцией posix mmap (3)? Как отличить guish, какой из них используется при просмотре исходного кода, поскольку они имеют одинаковый заголовочный файл. Подробнее см. Ниже.

Я работаю в Ubuntu. Я не думаю, что это имеет значение, какую операционную систему вы используете. Страница mannual на самом деле не дает много полезной информации.

Согласно ответу Jörg W Mittag, я думаю, что mmap должна быть функцией posix, когда я рассматриваю исходный код Но мне интересно, почему мне не нужно явно ссылаться на библиотеку posix при использовании функции mmamp (3). Я имею в виду, что при компиляции ie исходного кода не требуется дополнительный флаг ссылки.

Что касается ответа Фашингбауэра, возникает некоторый вопрос, если мы сделаем вывод о том, что ни один posix mmap не реализован. время , есть соответствующие с теми же функциями (например, shmget, semget, msgget). Как это объяснить? По крайней мере, я думаю, что некоторые функции posix реализованы с помощью linux.

#log for "man 2 mmap"
MMAP(2)  Linux Programmer's Manual                                                         
NAME
       mmap, munmap - map or unmap files or devices into memory
SYNOPSIS
       #include <sys/mman.h>



#log for "man 3 mmap"
MMAP(3POSIX)  POSIX Programmer's Manual                                                    
PROLOG
       This  manual page is part of the POSIX Programmer's Manual.  The Linux implementation of this interface may differ (consult the corresponding Linux manual page for details of Linux behavior), or the interface may not be implemented on Linux.    
NAME
       mmap — map pages of memory
SYNOPSIS
       #include <sys/mman.h>

Ответы [ 3 ]

4 голосов
/ 25 апреля 2020

POSIX против Linux

Сначала несколько фактов:

  1. POSIX - это стандарт, разработанный органом по стандартизации. POSIX не реализует ничего , а скорее определяет набор функций и поведение интерфейсов. Частью этого определения является несколько страниц руководства - «Руководство программиста POSIX»
  2. Linux реализует стандарт POSIX, как и другие операционные системы UNIX. (Я не знаю, является ли Linux «сертифицированным POSIX», и мне все равно.) При реализации стандарта POSIX, Linux дает свободу расширять стандарт с помощью Linux Speci c функций; следовательно, он содержит собственный набор справочных страниц, "Linux Руководство программиста".

Глядя на справочную страницу Linux ("man 2 mmap"), вы можете видеть, что она определяет Например, бит MAP_LOCKED в аргументе flags (кстати, MAP_LOCKED делает отдельный вызов mlock() ненужным). Этот флаг не отображается на справочной странице POSIX ("man 3 mmap"), поскольку он не требуется стандартом POSIX для соответствующей реализации.

Тем не менее, нет способа использовать альтернативную реализацию mmap() в Linux. Если какой-то исходный код, который вы читаете, использует mmap(), а вы используете Linux, то используется реализация Linux mmap(), просто потому, что его реализация POSIX отсутствует.

Соответственно, версия POSIX содержит в реализации Linux. Linux «совместим» с POSIX, так сказать - он не переопределяет никакие функции, требуемые POSIX (это будет означать нарушение стандарта), но добавляет только расширения, такие как MAP_LOCKED выше.

Страницы справочника

Хм. Мое личное мнение таково, что версия POSIX, скажем, справочной страницы mmap предназначена только для того, чтобы сбить с толку пользователей. Если вы случайно попали в раздел «3» mmap() man-страница и не знаете, каковы отношения между POSIX и Linux, то вы действительно в лучшем случае запутались, а в худшем - на неправильном пути.

Я предлагаю вам опустить номер раздела и просто сказать «man mmap» - при этом во всех разделах руководства выполняется поиск «mmap» и останавливается на первом (точное определение см. В «man man») .

(Это не работает так, как предполагалось с "man write", когда вы ищете определение системного вызова write(), потому что есть команда "write" с таким же раздел «1» :-))

Системные вызовы

Как указано в «man man», ручной раздел «2» содержит документацию по системным вызовам. Знание того, что mmap() реализовано ядром Linux (потому что именно ядро ​​реализует основные функции ОС, такие как управление памятью), может только помочь устранить путаницу в том, что документация, которую вы читаете, - это то, что вам нужно.

0 голосов
/ 27 апреля 2020

Но мне интересно, почему мне не нужно явно ссылаться на библиотеку posix при использовании функции mmamp (3).

Вам не нужно связывать другую библиотеку, потому что mmap содержится в GLIBC; Вы можете увидеть это, например, с помощью

 nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep mmap
00000000000e4610 W mmap
00000000000e4610 W mmap64
0 голосов
/ 24 апреля 2020

В чем различия между linux system mmap (2) и функцией posix mmap (3)?

Раздел 2 документирует системные вызовы. Раздел 3 документа функций. Следовательно, mmap(2) - это вовсе не функция, это системный вызов.

Как отличить guish, какой из них используется при просмотре исходного кода?

Если это вызов функции, то это mmap(3). Если это системный вызов, это mmap(2). Поскольку невозможно syscalls портировать из C, всегда будет какая-то функция макроса или оболочки для системного вызова.

Кроме того, если вы не читаете исходный код библиотеки времени выполнения для * Компилятор 1021 * (например, G CC) или исходный код библиотеки POSIX (такой как Glib c, dietlib c, µClib c или musl), маловероятно, что вы найдете любые системные вызовы в коде.

...