7

有谁知道mmap(2)和有什么区别mmap(3)?手册第 3 节被描述为“本章描述了除第 2 章中描述的实现系统调用的库函数之外的所有库函数。” 不mmap(3)执行系统调用?

阅读这两个手册页,我发现它mmap(2)似乎接受了比实际更广泛的标志mmap(3),并声称能够映射设备 I/O 空间。 mmap(3)声称能够将“共享内存对象”和“类型化内存对象”映射到文件中,但没有提及设备 I/O。

由于这两个函数具有相同的名称,我什至不确定如何选择一个而不是另一个。

4

1 回答 1

18

mmap(3)应该是POSIX函数。它应该在所有方面都提供 POSIX 要求的语义,即使这与 Linux “本机”所做的有所不同。mmap(2)是系统调用,并提供了所有 Linus 认为重要的花里胡哨的东西。当然,C 库函数是使用系统调用实现的。

要从字面上调用系统调用(绕过 C 库),您可以使用<sys/syscall.h>.

mmap(3) 的实际实现可以在C 库中找到。如您所见,它通常将控制权直接转移到 mmap(2),除非在编译时(glibc)选择 mmap2(2) 作为“后端”。

于 2009-08-30T17:15:37.640 回答