【问题标题】:mmap return EINVAL when run with Valgrind使用 Valgrind 运行时 mmap 返回 EINVAL
【发布时间】:2014-12-09 15:28:18
【问题描述】:

针对 Valgrind 运行的 mips32 应用程序在 mmap 函数中失败。如果我单独运行它可以正常工作,但是当我针对 valgrind 运行它时,它每次都会失败并显示 EINVAL。

   void * mem = (uint32_t *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, <fd>,
                                 mmap_size);

【问题讨论】:

    标签: valgrind mmap mips32


    【解决方案1】:

    当客户端应用程序针对 Valgrind 运行时,Valgrind 会拦截客户端进行的 mmap 调用。然后它通过设置 MAP_FIXED 标志调用内核的 mmap 函数,并指定要映射的内存位置。然后内核将尝试映射到这个建议的内存。当建议的位置不可用于映射时,内核会返回失败 (EINVAL),因为设置了 MAP_FIXED 标志。上面的函数调用会被翻译成,

    void * mem = (uint32_t *)mmap( advised_memory, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, <fd>,
                                                   mmap_size);
    

    您可以修改 Valgrind 的 mmap 函数来修复此行为。删除 MAP_FIXED 标志并重试 mmap,而不指定建议的内存地址。

    --- .coregrind/m_syswrap/syswrap-mips32-linux.c 2014-09-08 13:28:45.000000000 +0100
    +++ coregrind/m_syswrap/syswrap-mips32-linux.c 2014-11-19 12:12:43.000000000 +0000
    @@ -452,10 +452,11 @@
    /* Otherwise we're OK (so far). Install aspacem's choice of
    address, and let the mmap go through. */
    sres = VG_(am_do_mmap_NO_NOTIFY)(advised, arg2, arg3,
    - arg4 | VKI_MAP_FIXED,
    + arg4,
    arg5, arg6);
    
    - /* A refinement: it may be that the kernel refused aspacem's choice
    +
    + /* A refinement: it may be that the kernel refused aspacem's choice
    of address. If we were originally asked for a hinted mapping,
    there is still a last chance: try again at any address.
    Hence: */
    @@ -470,10 +471,20 @@
    }
    /* and try again with the kernel */
    sres = VG_(am_do_mmap_NO_NOTIFY)(advised, arg2, arg3,
    - arg4 | VKI_MAP_FIXED,
    + arg4,
    + arg5, arg6);
    +
    + if( sr_isError(sres) )
    + sres = VG_(am_do_mmap_NO_NOTIFY)(NULL, arg2, arg3,
    + arg4,
    arg5, arg6);
    }
    
    + if( sr_isError(sres) )
    + sres = VG_(am_do_mmap_NO_NOTIFY)(NULL, arg2, arg3,
    + arg4,
    + arg5, arg6);
    + 
    if (!sr_isError(sres)) {
    ULong di_handle;
    /* Notify aspacem. */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多