2009-08-30 71 views
7

有没有人知道mmap(2)mmap(3)是什么区别? Man部分3被描述为“本章描述除了实现系统调用的第2章中描述的库函数之外的所有库函数。” mmap(3)是否执行系统调用?mmap(2)vs mmap(3)

阅读这两个手册页,我看到mmap(2)似乎接受比mmap(3)更多种类的标志,并声称可以映射设备I/O空间。除此之外,声称能够映射“共享内存对象”和“类型化内存对象”,但不提及设备I/O。

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

回答

18

mmap(3)应该是POSIX function。它应该尽可能地提供POSIX强制要求的语义,即使这背离了Linux“本地”的含义。 mmap(2)是系统调用,并提供Linus认为重要的所有铃声和哨声。当然,C库函数是使用系统调用实现的。

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

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

+0

谢谢你,那很清楚。还要感谢指向C库源代码树的指针。尽管我在内核和驱动程序级别做了大量工作,但除了测试实用程序之外,我很少进入用户空间,而且我根本没有关注glibc源代码。我可以看到我一直在思考一些非常有用的解决方案。 – EQvan 2009-08-30 17:30:45