【问题标题】:How to determine whether a memory page is mmaped in C如何在C中确定内存页面是否被映射
【发布时间】:2014-02-17 12:43:33
【问题描述】:

我想知道一种方法来确定一个指针是否属于一个映射的内存页。

StackOverflow 上的post 建议在指针上使用 msync() 来确定它是否通过。但是我发现只要指针是页面大小的倍数,msync() 就会成功,无论页面是否被映射。

我通过宏计算页面的起始地址:

#define align_to_page(addr,pagesize) (addr & ~(pagesize - 1))

请帮帮我,我已经研究了很长时间,在这里被屏蔽了。提前谢谢你:)

背景: 我正在开发 Python 和 Numpy 的扩展。在某些函数中,它必须区分普通的 numpy.ndarray 和 numpy.memmap ,后者是 numpy.ndaraay 的子类,其数据缓冲区由磁盘上的文件支持的 mmap() 创建。

【问题讨论】:

    标签: python c numpy mmap


    【解决方案1】:

    所有非空进程地址空间都是mmaped。使用 mmap syscall 或间接通过 brk/sbrk syscalls 。

    您可能需要找到另一种方法来区分numpy 数组。

    numpy.memmap 文档说这些数组有额外的属性filenameoffsetmode,也许你可以使用这些来检测数组是否由文件支持。

    【讨论】:

    • 你是对的。我发现该进程可访问的每个页面都是 mmap 页面,要么是匿名的,要么是由某个文件支持的。我可以将 madvise 或 msync 等功能应用于数据段中的每个页面。
    • 您通过特殊属性区分 memmap 的想法非常有效:D 我以“flush”方法作为判断它是否为 memmap 的条件。它让我想起了 Python 解释器如何将对象与类定义进行比较。非常感谢!
    【解决方案2】:

    好吧,如果你知道你的连续内存池的起始地址和它的大小,你只需要检查你的指针:

    if( (my_ptr >= start_addr) && (my_ptr < start_addr + pool_size) )
    {
        return true; // my_ptr belongs to the memory pool
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 2016-06-21
      • 2017-10-15
      • 2019-10-28
      • 2012-01-06
      相关资源
      最近更新 更多