gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:01:17 29 4
gpt4 key购买 nike

因此,我正在尝试检查是否可以使用 mprotect 正确更改对映射分配内存的访问权限。这就是我写的:

#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之后:

01776000-01798000 rw-p 00000000 00:00 0                                  [heap]

mprotect之后功能:

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 之后被分成了三部分只有堆的第二部分获得我在函数中提供的访问权限。为什么会出现这种划分,为什么只有划分的堆的第二个区域获得权限?注意:我搜索了联机帮助页,但完全没有发现任何相关内容。

最佳答案

您在地址 p 分配了 0x1000 字节,在您的示例中为 0x1778000。当您使用这些参数调用 mprotect 时,它确实如您所愿地工作并标记为 01778000-01779000 rwxp

因此,您的问题可以更恰本地表述为,为什么 posix_memalign(3) 似乎分配了比您请求的更多的空间?

让我们看一下 man posix_memalign:

POSIX requires that memory obtained from posix_memalign() can be freed using free(3).

但是 free(3) 怎么知道要释放多少字节呢?它需要将它存储在您分配的页面之外的某个地方。 malloc(3) 或 friend 的后续调用如何知道在哪里可以找到释放的 block ?这些也需要存储在某个地方。

堆分配器将其用于管理堆的数据结构存储在堆上也就不足为奇了。

如果您想要一种更底层的方式来分配页面,请使用mmap(2):

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

这 block 内存由你管理,当你调用munmap(2)时,直接通知内核删除映射。没有在用户空间进行回收或管理。

关于c - 堆对齐内存上的 mprotect 神秘地工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35239300/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com