【问题标题】:How do I know the bounds of my mmaped allocation?我怎么知道我的映射分配的界限?
【发布时间】:2012-09-14 10:06:39
【问题描述】:

我正在使用 mmap 创建一个 12 字节的匿名映射(我知道的很小)

p = mmap(NULL,
        12,
        PROT_READ| PROT_WRITE,
        MAP_ANONYMOUS | MAP_PRIVATE,
        -1,
        0);

然后我想验证我是否可以写超过这 12 个字节

p=p+13;
strcpy(p,str);
printf("String at p is %s\n", ((char *)p));

果然我可以读写这个区域。我尝试通过将指针增加 20,000 来移动约 5 页。我系统上的页面大小为 4096。我使用 sysconf(_SC_PAGESIZE) 发现了这一点。我仍然可以读写指针

怎么了?我做错了什么还是我还没有达到一些 glibc 限制?

编辑:为了验证,我希望我的代码失败,超出某个限制,我无法意识到该限制在哪里

【问题讨论】:

    标签: c memory memory-management malloc mmap


    【解决方案1】:

    对于小的增量,您只是看到虚拟内存按页面组织这一事实的产物。页大小是可以分配给进程的最小内存增量。

    对于较大的增量,您可能只是遇到了为其他目的而分配的页面,例如堆、堆栈或其他文件的映射。

    【讨论】:

    • 在这种情况下,大增量不应该失败吗?具体来说,我想了解什么时候我会在超出一定范围的情况下无法阅读或写作。就我而言,即使有 5 页也似乎无法达到界限,而我只要求 12 个字节!
    • 假设您的堆使用地址 10,000 到 50,000,并且 mmap 在位置 6,000 处分配一个块。当你将 20,000 添加到 mmap 地址时,即为 26,000,它位于堆的中间。你不能依赖它永远失败,系统没有理由不能为不同的目的分配相邻的地址页,你只会从一个溢出到下一个。
    • 如果你正在设计一个新的 malloc 实现,你必须跟踪你正在管理的堆的边界。当您越界时,您不能依赖系统向您发送信号。
    • 您可以显式分配一个页面并从中删除所有权限,以确保在您的有效页面之后有一个无效页面,这就是“围栏发布”分配调试器(例如,参见@ 987654321@) 做。
    • 但是如果应用程序将指针递增到足以跳过保护页,它就不会注意到这一点。但它对于捕获以小间隔步进的应用程序很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2015-12-31
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多