Goog下午,我最近下载了www.kernel.org主线2.6.39 Linux内核源代码分发 . 我们正在寻找void mmap的Linux源代码(void start,size_t length,int prot,int flags,int fd,off_t offset) . 在解压缩tar.bz2发行版之后,我们找到了一个包含内存映射源代码的文件mmap.c . 但是,我们不能在mmap.c中使用void mmap(void start,size_t length,int prot,int flags,int fd,off_t offset)的Linux源代码 . 在我们获取void mmap的Linux源代码(void start,size_t length,int prot,int flags,int fd,off_t offset)的任何Linux工程师或管理员knwo?另外,我们对MapViewOfFile的Windows源代码感兴趣 . 我知道这一点,因为Microsoft OS源代码不在开源域中 . 如果有人想知道为什么我们需要这个源代码,我们正在尝试使用32位架构上的缓存内存映射文件实现来优化C重复数据删除程序原型的运行时性能 . 我们想了解如何使用mmap和MapViewOfFile来优化原型的运行时性能?谢谢 .
5 回答
要获得Win32
MapViewOfFile
实施,您必须支付昂贵的订阅费用,签署法律保密协议等 .linux
mmap
是公开可读的 . 但是,您应该知道有两个部分:glibc中的mmap
函数,以及内核中匹配的系统调用,其中所有有趣的位都是 . 您显示的签名是glibc函数,不要指望系统调用具有完全相同的参数 .但是你可以“理解如何使用
mmap
和MapViewOfFile
”而无需阅读实现 .从android源代码中提取;
资料来源:mmap.c
现在,实际的
__mmap2
调用具有汇编,所以's going to depend on your arch. Here'是一个x86版本:资料来源:__mmap2.S
我的直接猜测是,试图弄清楚如何从源代码到函数更好地使用它们可能(最多)是一种非常迂回的方式来获取大部分的任何地方 . 特别是,您可能需要查看更多/其他代码才能获得更多功能 . 当你了解它时,mmap / MapViewOfFile本身的代码可能是最小的帮助(充其量),而其他代码(例如在文件系统驱动程序和文件缓存中)可能更有意义 .
当您了解它时,mmap和MapViewOfFile具有相对简单的作业:设置页面描述符,将一系列虚拟地址映射到某个文件的某些部分 .
在您尝试访问其中一个页面之前,没有其他/更多的事情发生 . 那会引发“不存在”的错误 . 故障处理程序将使用I / O子系统从磁盘读入相应的数据,并返回让原始指令执行 . 仍然没有多少非常有趣 .
至少从优化的角度来看,事情变得有趣的一点是I / O子系统内部 . 这可能(例如)跟踪页面错误的历史记录,并使用它来预测很快可能需要哪些页面(如果是,则在故障发生之前发出预测页面的读取) .
但是,最好的情况是,mmap / MapViewOfFile的源代码根本不会直接导致您可能关心的I / O子系统部分(实际上,它们在这方面可能几乎完全没用) .
有趣,但我也需要mmap源... :)
到目前为止,我只能在NetBSD上找到答案 . Based on this comment:
libc函数在src/lib/libc/sys/mmap.c
相应的内核函数在src/sys/uvm/uvm_map.c中:
int uvm_map(struct vm_map * map,vaddr_t startp / IN / OUT * /,vsize_t size,struct uvm_object * uobj,voff_t uoffset,vsize_t align,uvm_flag_t flags)
实际链接对应于NetBSD版本8,但您可以将其替换为任何其他版本 .
问候 .
对于
MapViewOfFile
,我会检查Winbase.h,但它可能只是声明,否则你必须转向逆向工程,这在大多数国家被认为是非法的 .我在MMAP上找到了一篇文章here及其工作原理 . 也许这有帮助 .