mmap(2)和mmap(3)的区别

8
有人知道 mmap(2)mmap(3) 之间的区别吗?第 3 章节描述了“除了第 2 章节中描述的实现系统调用的库函数之外的所有库函数。” 难道 mmap(3) 不是执行系统调用吗?
通过阅读这两个手册页面,我发现 mmap(2) 似乎接受比 mmap(3) 更多种类的标志,并声称能够映射设备 I/O 空间。 mmap(3) 声称能够映射“共享内存对象”和“类型化内存对象”,除了文件之外,但没有提到设备 I/O。
由于这两个函数具有相同的名称,我甚至不确定如何选择一个而不是另一个。
1个回答

19

mmap(3)是一个被认为是POSIX函数的函数。它应该在所有方面提供 POSIX 规范所要求的语义,即使这与 Linux 本地行为不一致。而mmap(2)是系统调用,提供了 Linus 认为重要的所有功能。当然,C 库函数是由系统调用实现的。

要直接调用系统调用(绕过 C 库),可以使用 <sys/syscall.h>

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


谢谢,讲得非常清楚。感谢您指向C库源代码树。虽然我在内核和驱动程序级别上做了相当多的工作,但除了测试实用程序之外,我很少涉足用户空间,并且我根本没有研究过glibc源代码。我可以看到我一直缺少了解决许多问题的非常有用的方法。 - EQvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接