在Linux(或Solaris)中,除了反复手动解析`/proc/self/maps`以确定你是否可以读取、写入或执行存储在一个或多个内存地址中的任何内容之外,还有更好的方法吗?例如,在Windows中,您可以使用`VirtualQuery`。在Linux中,我可以使用`mprotect`来更改这些值,但我不能读取它们。此外,是否有任何方法可以知道这些权限何时更改(例如,当某人在后台使用`mmap`映射文件时),而不是进行可怕的侵入式操作并在进程中拦截所有线程上的`syscall`以影响内存映射?
更新:不幸的是,我正在使用JIT,它对其执行的代码几乎没有任何信息,以获取有关常量的近似值。是的,我知道我可以具有可变数据的常量映射,例如Linux使用的vsyscall页面。我可以安全地假设初始解析未包含的所有东西都是可变且危险的,但我对该选项并不完全满意。现在我所做的就是读取 `/proc/self/maps` 并构建一个二进制搜索结构,以查找给定地址的保护。每次我需要了解我的结构中没有的页面信息时,我会重新读取 /proc/self/maps,假设它已被添加到其中或者我即将遇到段错误。似乎仅通过解析文本来获取此信息并不知道何时更改非常麻烦。(`/dev/inotify` 在`/proc`中几乎不起作用)
更新:不幸的是,我正在使用JIT,它对其执行的代码几乎没有任何信息,以获取有关常量的近似值。是的,我知道我可以具有可变数据的常量映射,例如Linux使用的vsyscall页面。我可以安全地假设初始解析未包含的所有东西都是可变且危险的,但我对该选项并不完全满意。现在我所做的就是读取 `/proc/self/maps` 并构建一个二进制搜索结构,以查找给定地址的保护。每次我需要了解我的结构中没有的页面信息时,我会重新读取 /proc/self/maps,假设它已被添加到其中或者我即将遇到段错误。似乎仅通过解析文本来获取此信息并不知道何时更改非常麻烦。(`/dev/inotify` 在`/proc`中几乎不起作用)