草庐IT

mprotect

全部标签

c++ - 内存访问回调?

当访问(读取或写入)内存时,是否存在分配内存并进行某种回调(指向函数或信号的指针)的方法?例如,如果我说分配1mb的内存,我希望有一种方法可以在访问这1mb的任何内存时调用函数。我正在使用的平台是x86Linux并使用C/C++编写。 最佳答案 是的,有。使用mprotect(2)系统调用(参见:http://linux.die.net/man/2/mprotect)在页面上设置只读或不可访问内存保护,并设置将在访问内存时调用的SIGEGV信号处理程序。请注意,您将需要在信号处理程序中使用mprotect以在调用信号处理程序后实际允

c - mmap/mprotect-readonly 零页是否计入已提交内存?

我想在我的进程中保留虚拟地址空间,用于以前使用但目前不需要的内存。我对主机内核是Linux并且配置为防止过度使用(它通过详细计算所有已提交的内存来实现)的情况感兴趣。如果我只是想防止我的应用程序不再使用的数据占用物理内存或交换到磁盘(无论哪种方式都在浪费资源),我可以madvise不需要它的内核,或mmap新的零页覆盖在它上面。但是,这两种方法都不一定会减少算作已提交的内存量,从而阻止其他进程使用这些内存。如果我用标记为只读的新零页替换这些页会怎样?我的意图是它们不计入提交的内存,而且我以后可以使用mprotect使它们可写,如果使它们可写会超过提交的内存限制,它将失败。我的理解正确吗

c - mmap/mprotect-readonly 零页是否计入已提交内存?

我想在我的进程中保留虚拟地址空间,用于以前使用但目前不需要的内存。我对主机内核是Linux并且配置为防止过度使用(它通过详细计算所有已提交的内存来实现)的情况感兴趣。如果我只是想防止我的应用程序不再使用的数据占用物理内存或交换到磁盘(无论哪种方式都在浪费资源),我可以madvise不需要它的内核,或mmap新的零页覆盖在它上面。但是,这两种方法都不一定会减少算作已提交的内存量,从而阻止其他进程使用这些内存。如果我用标记为只读的新零页替换这些页会怎样?我的意图是它们不计入提交的内存,而且我以后可以使用mprotect使它们可写,如果使它们可写会超过提交的内存限制,它将失败。我的理解正确吗

c - 调用位于堆中的函数时出现段错误

我正在尝试稍微调整这里的规则,以及malloc一个缓冲区,然后将函数复制到缓冲区。调用缓冲函数有效,但是当我尝试调用其中的另一个函数时,该函数会引发段错误。任何想法为什么?#include#include#include#includeintfoo(intx){printf("%d\n",x);}intbar(intx){}intmain(){intfoo_size=bar-foo;void*buf_ptr;buf_ptr=malloc(1024);memcpy(buf_ptr,foo,foo_size);mprotect((void*)(((int)buf_ptr)&~(syscon

c - 调用位于堆中的函数时出现段错误

我正在尝试稍微调整这里的规则,以及malloc一个缓冲区,然后将函数复制到缓冲区。调用缓冲函数有效,但是当我尝试调用其中的另一个函数时,该函数会引发段错误。任何想法为什么?#include#include#include#includeintfoo(intx){printf("%d\n",x);}intbar(intx){}intmain(){intfoo_size=bar-foo;void*buf_ptr;buf_ptr=malloc(1024);memcpy(buf_ptr,foo,foo_size);mprotect((void*)(((int)buf_ptr)&~(syscon

c - 有没有比解析/proc/self/maps 更好的方法来找出内存保护?

在Linux(或Solaris)上,有比手动解析/proc/self/maps更好的方法来确定您是否可以读取、写入或执行存储在一个或内存中有更多地址?例如,在Windows中您有VirtualQuery。在Linux中,我可以mprotect来更改这些值,但我无法读回它们。此外,除了做一些非常具有侵入性的事情和使用ptrace之外,还有什么方法可以知道这些权限何时更改(例如,当有人在我背后对文件使用mmap时)>在进程中的所有线程上拦截任何可能影响内存映射的系统调用尝试?更新:不幸的是,我在一个JIT内部使用它,它几乎没有关于它正在执行的代码的信息来获得常数的近似值。是的,我意识到我可

c - 有没有比解析/proc/self/maps 更好的方法来找出内存保护?

在Linux(或Solaris)上,有比手动解析/proc/self/maps更好的方法来确定您是否可以读取、写入或执行存储在一个或内存中有更多地址?例如,在Windows中您有VirtualQuery。在Linux中,我可以mprotect来更改这些值,但我无法读回它们。此外,除了做一些非常具有侵入性的事情和使用ptrace之外,还有什么方法可以知道这些权限何时更改(例如,当有人在我背后对文件使用mmap时)>在进程中的所有线程上拦截任何可能影响内存映射的系统调用尝试?更新:不幸的是,我在一个JIT内部使用它,它几乎没有关于它正在执行的代码的信息来获得常数的近似值。是的,我意识到我可

c - mprotect 整个程序,运行危险代码

我有一个小程序,它映射具有潜在危险的可执行代码(使用PROT_EXEC),调用prctl(PR_SET_SECCOMP,1)然后执行这个映射的代码。这一切都很好,并且允许我通过将mmap区域同步到磁盘来“保存”评估状态,并在以后重新加载它(很可能在另一台机器上进行负载平衡)。然而,这种技术并不总是有效——因为这段代码可能对不在mmap区域中的程序进行了更改,并且这些信息将会丢失。所以我想做的是在调用代码之前将所有内容(除了这个mmap区域)设置为只读。这样我就可以保证可执行代码不能更改除我可以随意序列化/反序列化的mmap区域之外的任何其他内容的状态。顺便说一句,这是x86_64上的L

c - mprotect有多快

我的问题是mprotect有多快。与1GB的连续内存相比,mprotecting说1MB的连续内存有什么区别?我当然可以测量时间,但我想知道幕后发生了什么。 最佳答案 对源的快速检查似乎表明它迭代了选定区域中的进程映射并更改了它们的标志。如果您保护的不是整个映射,它会将其分成两个或三个。简而言之,它是O(n),其中n是您调用mmap的次数。在/proc/pid/maps可以看到当前所有的map 关于c-mprotect有多快,我们在StackOverflow上找到一个类似的问题:

linux - Linux 内核中类似 mprotect() 的功能

我在Linux内核模块中,我使用vmalloc()分配了一些内存。我想让内存有读、写、执行权限。这样做的干净和适当的方法是什么?基本上,这通常等同于调用mprotect(),但在内核空间中。如果我执行页面遍历,pgd_offset()、pud_offset()、pmd_offset()、pte_offset_map(),然后是pte_mkwrite(),我在2.6.39上尝试时遇到链接错误。此外,如果我正在执行页面遍历,这似乎是一种hack,应该有一种更清晰、更合适的方法。我的内核模块将是一个可加载模块,因此我无法使用内部符号。预先感谢您的指导。 最佳答案