所以我试图检查,如果我可以正确地使用mprotect更改mmapped分配内存的访问权限,这就是我写的:
#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,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]
mprotectfunction之后:
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之后被分成三部分,并且只有堆的第二部分获得了我在函数中给出的访问权限。 为什么这个分裂发生,为什么只有分裂的堆的第二个区域获得权限? 注意:我已经search了manpages,并且对此没有任何发现。
纳秒睡眠不适用于小于一秒的值
C程序没有标题
Windows堆pipe理器 – 前端和后端分配器
如何在Windows上使用std :: system使用空格运行可执行文件
使用Cygwin或MinGW可以将Linux守护进程移植到Windows吗?
如何将VLC媒体播放器embedded到我的C#窗体窗体应用程序?
在dlclose()之后访问由共享库分配的内存
当两个进程尝试访问信号量为0的关键部分时会发生什么?
gnuc中的可变长度结构
你在地址p分配了0x1000字节,在你的例子中是0x1778000 。 当您使用这些参数调用mprotect时,它确实按照您的要求工作,并标记为01778000-01779000 rwxp 。
因此,您的问题可以更恰当地表述为什么posix_memalign(3)似乎分配了比您要求的更多空间?
让我们看看man posix_memalign :
POSIX要求从posix_memalign()获得的内存可以使用free(3)释放。
但free(3)如何知道多少字节释放? 它需要将其存储在您分配的页面之外的某处。 而且, malloc(3)或朋友的后续调用如何知道在哪里找到释放块? 这些也需要存储在某个地方。
堆分配器存储它用于管理堆上的堆的数据结构并不奇怪。
如果您想要更低级别的方式分配页面,请使用mmap(2) :
p = mmap(0,getpagesize(),PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
这个内存是由你管理的,当你调用munmap(2) ,通过直接通知内核来删除映射。 在用户空间没有回收或管理。
有关malloc(3)更多信息: malloc()和free()如何工作?
维基百科有关C的动态内存设施的文章: https : //en.wikipedia.org/wiki/C_dynamic_memory_allocation
glibc的malloc(3)实现malloc(3)等: https : //github.com/lattera/glibc/blob/master/malloc/malloc.c#L3016
关于glibc实现的博客文章: https : //sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。