如何保护随机大小的内存?

时间:2014-02-18 09:36:50

标签: c unix

我想保护随机大小的堆内存。我知道有一个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个字节,而不是整个页面。

1 个答案:

答案 0 :(得分:3)

我不这么认为。限制整页的原因通常是由于硬件限制; MMU根本不检查字节级别的访问。

您可以做的一个技巧是分配整个页面,然后在页面末尾对齐“随机”小块。这是一个非常粗略的例子:

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

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