问题标签 [mprotect]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 处理 pagefaulte 异常后如何使 mprotect() 取得进展?
我想使用 mprotect() 拦截对我的应用程序中特定内存块的所有内存引用,所以我稍微修改了此处找到的 mprotect 示例代码。但是,当我运行修改后的代码时,应用程序不会在捕获的第一个异常之后继续前进。相反,Linux 将继续向我的应用程序发送异常,并且我的应用程序将继续在无限循环中打印出同一行。
现在,我的问题是如何告诉 Linux 继续前进并进入下一条指令。
以下是输出示例:
这是代码:
c - 免费通话前是否需要重置保护
malloc
我通过and分配了一些大块的内存aligned_alloc
,然后我在内存中的一个区域设置了一个栅栏,其大小为一页大小,使用mprotect
:
现在我已经完成了内存并正在调用free(buf);
以释放它,我的问题是我需要mprotect
在调用之前重置free
,如下所示:
还是我应该这样做free
?我读到glibc有时会重用一些以前分配的内存,所以如果这个内存区域稍后返回malloc
,访问它会导致问题(因为它是PROT_NONE
)?
c - 多线程的 mprotect 行为
出于并发/并行 GC 的目的,我对 mprotect 系统调用提供的内存顺序保证(即 mprotect 多线程的行为或 mprotect 的内存模型)感兴趣。我的问题是(假设没有编译器重新排序或有足够的编译器障碍)
如果线程 1 由于线程 2 上的 mprotect 触发了地址上的段错误,我是否可以确定在段错误的信号处理程序中的线程 1 中观察到系统调用之前,所有事情都发生在线程 2 上?如果在对线程 1 执行加载之前在信号处理程序中放置了一个完整的内存屏障怎么办?
如果线程 1 对由线程 2 设置为 PROT_NONE 的地址进行易失性加载并且没有触发段错误,那么这是否足够发生在两者之间的关系之前。或者换句话说,如果两个线程都这样做(
*ga
开始为0
,p
是一个页面对齐的地址以只读方式开始)是否可以保证
a
在线程 2 上会出现1
?(假设在线程 1 上没有观察到段错误并且没有其他代码修改*ga
)
我最感兴趣的是 Linux 行为,尤其是 x86(_64)、arm/aarch64 和 ppc,尽管欢迎访问有关其他 archs/OS 的信息(对于 Windows,将 mprotect 替换为 VirtualProtect 或其他任何名称......)。到目前为止,我在 x64 和 aarch64 Linux 上的测试表明没有违反这些规定,尽管我不确定我的测试是否是结论性的,或者是否可以长期依赖这种行为。
一些搜索表明,mprotect
可能会在删除权限时使用映射的地址对所有线程发出 TLB 击落,这可能会提供此处所述的保证(或者换句话说,提供此保证似乎是此类操作的目标),尽管我不清楚如果内核代码的未来优化可能会破坏这个保证。
参考LKML 帖子,我一周前问过这个问题,但还没有回复......
编辑:澄清问题。我知道 tlb 击落应该提供我正在寻找的保证,但我想知道是否可以依赖这种行为。换句话说,内核发出此类请求的原因是什么,因为如果不是为了提供某种排序保证,就不需要它。
c - mprotect() C 中的参数无效
我想用 posix_memalign 在数组“page”中分配 4096 字节,然后通过 mprotect() 用 PROT_NONE 保护它。分配似乎有效,但 protect() 返回 1 而不是 0。给定的错误代码是“无效参数”。
我认为这只是一个小错误,我无法检测到。提前感谢您的任何帮助或建议。
linux - 是否可以从内核模块调用 sys_mprotect
我正在编写一个需要更改任务页面权限的内核模块。通常,该任务只会调用 mprotect 并设置权限。据我了解,Linux 内核有sys_mprotect
,它执行实际的系统调用。
我的 Linux 内核模块有可能调用sys_mprotect
吗?我似乎找不到允许这样做的内核 API。
c - 在动态分配的内存上调用 mprotect 会导致错误代码 EACCES
在 C 课程中听到它之后,我一直在尝试使用自修改代码。我有一个使用 mprotect 为一段内存设置内存保护的函数:
但是,当我尝试在动态分配的内存块上调用它时,我收到错误代码 EACCES 的错误。为什么会发生这种情况,有什么办法可以绕过它?当f_data_buffer
在堆栈上分配时,没有错误消息(这是注释掉的行)。
代码调用SetMemoryProtections
:
更新:我将代码重写为它在调用 printf 之前读取 errno。(它创建了一个名为 err 的局部变量,将 err 设置为 errno,然后使用 err 调用开关)我得到了相同的 EACCES 错误代码。
macos - 在 macOS 上访问受保护内存时出现异常总线错误?
语境
我编写了一个小程序,目的是使用它来生成一个SIGSEGV
信号,我将用一个处理程序捕获它然后打印出来。
问题
我编写的程序在 Linux 上运行良好(或者看起来如此)。但是,在 macOS 10.11.6 上编译和执行时,它无法生成. SIGSEGV
,而是生成Bus error: 10
.
尝试的解决方案
在研究其他人是否遇到此错误时,我遇到了以下 SO Post:
https://stackoverflow.com/a/18829327/1883304
可悲的是,虽然我确实从 using 切换posix_memalign
到mmap
,但我仍然遇到总线错误。除了这个问题之外,我找不到可以提供帮助的相关问题。
程序
所以总而言之,有人可以告诉我保留内存的最新正确方法,以便我可以SIGSEGV
在 macOS 上提出 a 吗?
python - 10.13 High Sierra OSX - Python mprotect 在授予 exec 权限时总是失败,使用 ENOMEM
背景:
编写涉及在 python 程序中执行机器代码的概念证明。要在 osx 上执行此操作,我必须使用 ctypes 和 libc.dylib 以及以下函数调用:
(禁用 SIP)
- valloc 分配对齐的内存
- mprotect 授予 wrx 分配内存的权限
- memmove 将可执行代码复制到分配的内存;投掷; 并执行...
问题:
问题出现在 mprotect 函数调用中,它总是返回 -1 表示失败。
脚本:(逻辑几乎与 linux 系统相同,因为它们都是 posix 系列)
mmove 现在将失败并显示段错误错误消息(b/c 写入可能只有读取权限的内存空间),并且程序陷入困境......
问题出在 mprotect 上,这种方法在 linux 中效果很好,我现在看到 mac osx 的结果非常不同
问题:
Mac OSX 是否具有限制 mprotect 操作类型的额外安全功能(即使禁用 SIP)?如果是这样,如何绕过它?
更新:
根据评论中建议的@DietrichEpp,在 ctypes.CDLL 调用上使用 use_errno=True 会生成 errno。它评估为 errno:12,无法分配内存。此 errno 是 mprotect 手册页上 ENOMEM 的值。
尽管手册页上有一些 ENOMEM,但我怀疑这是最后一种情况:(b/c valloc 调用没有错误)
我怀疑 osx 有特殊限制,并且为每个进程设置了最大映射,因此添加更多权限,同一进程的新映射将超过这个最大限制(每个进程有多少个具有 exec/write 权限的映射)。如果我的假设是正确的,我们该如何解决呢?
c - 保护由多个线程共享的talloced内存免受写入
在我们的应用程序(网络守护进程)中,堆分配内存大致有三种用途。
启动时分配的内存,用于保存解析应用程序全局配置的结果。
创建线程时为线程特定数据分配的内存(并在它们被销毁时释放)。
服务请求时分配的内存并绑定到请求的生命周期。
在所有三种情况下,我们都使用talloc 来管理内存。
我们最近遇到了一些内存损坏问题,其中错误的指针值意味着一个或多个线程正在写入全局配置并导致崩溃。
由于应用程序的结构方式,在应用程序开始处理请求后,任何内容都不应该写入在情况 1) 中分配的内存。
有没有办法将情况 1) 中分配的内存标记为只读?
c++ - 从函数内部遇到 mmap 问题
我正在尝试编写一个其中包含 mmap 的函数,但是当我尝试从中访问内存时main()
,它会出现段错误。有谁知道为什么?
请忽略 MPI 标头 - 它用于项目的后期部分。我已注释掉该mprotect
行以查看它是 mmap 错误,而不是处理程序不一定工作
网络地图.cpp:
主文件