我想保护随机大小的堆内存。我知道有一个API:

#include <sys/mman.h>
int mprotect(void *addr, size_t length, int prot);

但是在大多数UNIX平台中,它要求addr必须是系统页面大小的倍数。另外,由于保护设置在整个页面上,因此长度实际上是四舍五入到系统页面大小的下一个倍数。
所以我考虑是否有一种方法可以保护随机大小的内存,而不是限制为系统页面大小的倍数。例如:
char *p = malloc(10);
mprotect(p, 10, PROT_READ);

这将只保护10个字节,而不是整个页面。

最佳答案

我不这么认为。限制整个页面的原因通常是由于硬件限制;MMU只是没有在字节级别检查访问。
你可以做的一个技巧是分配整个页面,然后在页面末尾对齐你的“随机”小块。下面是一个非常粗略的例子:

 [ block of some large size, i.e. 4096 bytes ][next block, not allocated]
 [ this space is wasted ...         ][ small ][access here will fail!]

但这将无法在块启动之前保护访问。

10-07 13:35