问题描述
我想知道是否有一种可移植的方式来动态分配内存,然后限制对该内存的一部分进行读/写访问,例如。 G。使用 POSIX 函数 mprotect()
。我可以想到以下方法:
- 使用
mmap()
分配内存,i。 e.mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0)
:这里,内存保护标志已经可以在初始分配调用中给出,并且可以选择稍后使用mprotect()
进行修改。
问题:MAP_ANONYMOUS
is not specified by POSIX,虽然它应该被 “almost all” 或 “most” systems 支持。 - 显然,using
mmap()
on/dev/zero
is 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.) 是最便携的。是否有另一种方法适用于更多系统(或者甚至更好,实际上由标准指定)?
解决方法
通过 shm_open
共享内存对象怎么样? shm_open
返回一个文件描述符,它可以被 mmap
映射,因此 mprotect
(ed)。