首页 文章

是否有可能获得mmap的Linux源代码和MapViewOfFile的Windows源代码?

提问于
浏览
0

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 回答

  • 3

    要获得Win32 MapViewOfFile 实施,您必须支付昂贵的订阅费用,签署法律保密协议等 .

    linux mmap 是公开可读的 . 但是,您应该知道有两个部分:glibc中的 mmap 函数,以及内核中匹配的系统调用,其中所有有趣的位都是 . 您显示的签名是glibc函数,不要指望系统调用具有完全相同的参数 .

    但是你可以“理解如何使用 mmapMapViewOfFile ”而无需阅读实现 .

  • 2

    从android源代码中提取;

    #include <unistd.h>
    #include <errno.h>
    #include <sys/mman.h>
    
    extern void*  __mmap2(void*, size_t, int, int, int, size_t);
    
    #define  MMAP2_SHIFT  12
    void*   mmap( void*  addr,  size_t  size, int  prot, int  flags, int  fd,  long  offset )
    {
        if ( offset & ((1UL << MMAP2_SHIFT)-1) ) {
        errno = EINVAL;
        return MAP_FAILED;
      }
    
        return __mmap2(addr, size, prot, flags, fd, (size_t)offset >> MMAP2_SHIFT);
    }
    

    资料来源:mmap.c

    现在,实际的 __mmap2 调用具有汇编,所以's going to depend on your arch. Here'是一个x86版本:

    /* autogenerated by gensyscalls.py */
    #include <sys/linux-syscalls.h>
    
        .text
        .type __mmap2, @function
        .globl __mmap2
        .align 4
    
    __mmap2:
        pushl   %ebx
        pushl   %ecx
        pushl   %edx
        pushl   %esi
        pushl   %edi
        pushl   %ebp
        mov     28(%esp), %ebx
        mov     32(%esp), %ecx
        mov     36(%esp), %edx
        mov     40(%esp), %esi
        mov     44(%esp), %edi
        mov     48(%esp), %ebp
        movl    $__NR_mmap2, %eax
        int     $0x80
        cmpl    $-129, %eax
        jb      1f
        negl    %eax
        pushl   %eax
        call    __set_errno
        addl    $4, %esp
        orl     $-1, %eax
    1:
        popl    %ebp
        popl    %edi
        popl    %esi
        popl    %edx
        popl    %ecx
        popl    %ebx
        ret
    

    资料来源:__mmap2.S

  • 2

    我的直接猜测是,试图弄清楚如何从源代码到函数更好地使用它们可能(最多)是一种非常迂回的方式来获取大部分的任何地方 . 特别是,您可能需要查看更多/其他代码才能获得更多功能 . 当你了解它时,mmap / MapViewOfFile本身的代码可能是最小的帮助(充其量),而其他代码(例如在文件系统驱动程序和文件缓存中)可能更有意义 .

    当您了解它时,mmap和MapViewOfFile具有相对简单的作业:设置页面描述符,将一系列虚拟地址映射到某个文件的某些部分 .

    在您尝试访问其中一个页面之前,没有其他/更多的事情发生 . 那会引发“不存在”的错误 . 故障处理程序将使用I / O子系统从磁盘读入相应的数据,并返回让原始指令执行 . 仍然没有多少非常有趣 .

    至少从优化的角度来看,事情变得有趣的一点是I / O子系统内部 . 这可能(例如)跟踪页面错误的历史记录,并使用它来预测很快可能需要哪些页面(如果是,则在故障发生之前发出预测页面的读取) .

    但是,最好的情况是,mmap / MapViewOfFile的源代码根本不会直接导致您可能关心的I / O子系统部分(实际上,它们在这方面可能几乎完全没用) .

  • 1

    有趣,但我也需要mmap源... :)

    到目前为止,我只能在NetBSD上找到答案 . Based on this comment

    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,但您可以将其替换为任何其他版本 .

    问候 .

  • 3

    对于 MapViewOfFile ,我会检查Winbase.h,但它可能只是声明,否则你必须转向逆向工程,这在大多数国家被认为是非法的 .

    我在MMAP上找到了一篇文章here及其工作原理 . 也许这有帮助 .

相关问题