【发布时间】:2021-02-16 12:41:46
【问题描述】:
我想知道是否有一种可移植的方式来动态分配内存,然后限制对该内存的一部分的读/写访问,例如。 G。使用 POSIX 函数mprotect()。我可以想到以下方法:
- 使用
mmap()分配内存,即。 e.mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0):这里,内存保护标志已经可以在初始分配调用中给出,并且可以选择在以后使用mprotect()进行修改。
问题:MAP_ANONYMOUSis not specified by POSIX,尽管它应该是由“almost all” 或“most” systems 支持。 - 显然,using
mmap()on/dev/zerois an alternative toMAP_ANONYMOUS。这将使mmap()称自己完全兼容POSIX,但似乎这种行为不一定比MAP_ANONYMOUS更便携(显然不适用于Mac OS X/macOS)。 - 使用
aligned_alloc()(或posix_memalign())分配内存并使用mprotect()。
问题:mprotect()according to POSIX is only specified for memory obtained viammap()的行为,虽然至少“on Linux, it is always permissible to callmprotect()on any address in a process’s address space (except for the kernel vsyscall area)”。
所以从标准的角度来看,问题在于mprotect()只与mmap()结合指定,但并没有标准与mmap()实际指定动态内存分配。似乎选项(1.)是最便携的。是否有另一种适用于更多系统的方法(或者更好的是,实际上由标准指定)?
【问题讨论】:
-
便携,你只能对整个内存页面进行操作。您是否阅读过the POSIX
mprotect()page 的这一部分:“mprotect()函数应将访问保护更改为prot为包含进程地址空间的任何部分的整个页面指定的访问保护从地址addr开始并继续len字节。" -
@AndrewHenle 是的,我知道。我的问题是如何在
mprotect()被允许操作的地方分配内存。 -
为什么不使用共享内存段? mprotect 用于内存对象...
-
好吧,既然 mprotect 只针对通过 mmap 获得的内存指定,我想你不应该问如何可移植地使用 mprotect,而应该问如何使用 mmap 可移植地分配内存。
-
@user253751 我想是这样,但我决定专注于
mprotect(),因为我想做内存保护,而mmap()只是该路径上的一个复杂细节。此外,也许还有另一种方式(我不知道)不直接使用mmap(),而是指定等效于使用mmap()。最后,在写这个问题时,我已经有点放弃了严格的 POSIX 合规性,所以我准备好接受使用mprotect()而不使用mmap()的答案。
标签: c posix standards mmap mprotect