首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆对齐内存上的mprotect神秘地工作

堆对齐内存上的mprotect神秘地工作
EN

Stack Overflow用户
提问于 2016-02-06 09:13:31
回答 1查看 1.1K关注 0票数 2

因此,我试图检查是否可以使用mprotect正确地更改所分配内存的访问权限,这就是我所写的:

代码语言:javascript
复制
#include <stdio.h>
#include <sys/mman.h>
#include <malloc.h>
#include <unistd.h>

void main()
{
        int pagesize;
        pagesize = getpagesize();
        void *p;
        p = malloc(pagesize);
        getchar();
        int q = posix_memalign(&p, pagesize, pagesize);
        getchar();
        int a = mprotect(p, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC);
        getchar();
        free(p);
}

现在,在每个函数之后,我使用getchar来使用cat /proc/<pid>/maps文件分析我的内存段,这就是我得到的内容:(只显示关于堆的信息,因为这是我唯一关心的)在posix_memalign之后

代码语言:javascript
复制
01776000-01798000 rw-p 00000000 00:00 0                                  [heap]

mprotect函数之后:

代码语言:javascript
复制
01776000-01778000 rw-p 00000000 00:00 0                                  [heap]
01778000-01779000 rwxp 00000000 00:00 0                                  [heap]
01779000-01798000 rw-p 00000000 00:00 0                                  [heap]

因此,如果您注意到在我使用mprotect之前分配的堆被划分为三个部分,那么只有堆的第二个部分才能获得我在函数中授予的访问权限。为什么会发生这种划分,为什么只有划分堆的第二个区域才能获得权限?注:我已经搜索了手册,并没有发现任何有关这方面的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-06 11:14:48

您在address p上分配了p字节,这是示例中的0x1778000。当您使用这些参数调用mprotect时,它确实可以按您的要求工作,并标记为01778000-01779000 rwxp

因此,您的问题的措辞可能更贴切,因为为什么posix_memalign(3)分配的空间似乎比您所要求的要多?

让我们来看看man posix_memalign

POSIX要求可以使用空闲(3)释放从posix_memalign()获得的内存。

但是free(3)如何知道要释放多少字节呢?它需要将它存储在您分配的页面之外的某个地方。随后对malloc(3)或朋友的调用如何知道在哪里找到已释放的块?这些东西也需要存放在某个地方。

毫不奇怪,堆分配器存储用于管理堆上的堆的数据结构。

如果您希望使用更低级别的方式分配页面,请使用mmap(2)

代码语言:javascript
复制
p = mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

此内存由您管理,当您调用munmap(2)时,将通过直接通知内核来删除映射。在用户空间内不进行回收或管理。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35239300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档