在分配的内存上使用 mprotect() 的最便携方法

问题描述

我想知道是否有一种可移植的方式来动态分配内存,然后限制对该内存的一部分进行读/写访问,例如。 G。使用 POSIX 函数 mprotect()。我可以想到以下方法:

  1. 使用 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 支持。
  2. 显然,using mmap() on /dev/zero is an alternative to MAP_ANONYMOUS。这将使 mmap() 调用自身完全兼容 POSIX,但似乎这种行为不一定比 MAP_ANONYMOUS 更具可移植性(显然不适用于 Mac OS X/macOS)。
  3. 使用 aligned_alloc()(或 posix_memalign())分配内存并使用 mprotect()
    问题:mprotect() according to POSIX is only specified for memory obtained via mmap() 的行为,尽管至少是 “on Linux,it is always permissible to call mprotect() 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)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...