C语言 如何保护随机大小的内存



我想保护我的随机大小的堆内存。我知道有一个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!]

但是,这将无法在阻止开始之前保护访问。

最新更新