首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有比解析/proc/self/map更好的方法来确定内存保护吗?

有比解析/proc/self/map更好的方法来确定内存保护吗?
EN

Stack Overflow用户
提问于 2008-11-06 16:26:09
回答 2查看 6.8K关注 0票数 18

在Linux (或Solaris)上,有没有比手动重复解析/proc/self/maps更好的方法来判断您是否可以读、写或执行存储在内存中一个或多个地址的任何内容?

例如,在Windows中,你可以使用VirtualQuery

在Linux中,我可以通过mprotect来改变这些值,但是我不能读回它们。

此外,除了在进程中的所有线程上使用mmap,并拦截任何可能影响内存映射的syscall尝试之外,还有什么方法可以知道这些权限何时发生变化(例如,有人在我背后对文件使用mmap)?

更新:

不幸的是,我在一个JIT中使用它,这个JIT几乎没有关于它正在执行的代码的信息,以获得常量的近似值。是的,我意识到我可以有一个可变数据的常量映射,就像Linux使用的vsyscall页面一样。我可以安全地退回到一个假设,即初始解析中没有包括的任何东西都是可变的和危险的,但我对这种选择并不完全满意。

现在我要做的是读取/proc/self/maps并构建一个结构,我可以通过它对给定地址的保护进行二进制搜索。每当我需要了解某个不在我的结构中的页面的相关信息时,我都会重新读取/proc/self/map,假设它是在此期间添加的,否则我无论如何都会遇到segfault。

通过解析文本来获取这些信息,而不知道它什么时候发生了变化,这似乎是非常残酷的。(在/proc中,/dev/inotify几乎不能在任何东西上工作)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-11-06 17:40:45

我不知道在Linux上有什么等同于VirtualQuery的东西。但其他一些可能或不起作用的方法有:

  • 您可以设置一个捕获SIGBUS/SIGSEGV的信号处理程序,然后继续读取或写入。如果内存受到保护,您的信号捕获代码将被调用。如果不是,则不会调用您的信号捕获代码。
  • 你可以跟踪你每次调用mprotect的时候,并构建一个相应的数据结构,帮助你知道一个区域是读还是写保护的。如果您可以访问所有使用mprotect.
  • you的代码,那么这将是一个不错的选择,它可以通过将您的代码与重新定义函数mprotect的库相链接来监视您的进程中的所有mprotect调用。然后,您可以构建必要的数据结构来了解某个区域是读保护的还是写保护的,然后调用系统mprotect进行实际设置,protection.
  • you可能会尝试使用/dev/inotify并监视文件/proc/self/maps是否有任何更改。我猜这个不管用,但应该值得一试。
票数 6
EN

Stack Overflow用户

发布于 2015-08-17 08:19:00

这是/was /proc/pid|self/pagemap,内核中的文档,这里有个警告:https://lkml.org/lkml/2015/7/14/477,所以它不是完全无害的……

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

https://stackoverflow.com/questions/269314

复制
相关文章

相似问题

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