我们有一个超大的数组用于对齐目的,因此通常的机制不能捕获一个错误。
是否有可能在Windows中保护一个小的,任意的区域(数组的开头和结尾的16个字节),这会导致访问冲突?语言是C ++。
答案 0 :(得分:4)
我相信在x86架构中,您可以将内存标记为受保护的最精细粒度用于页面(我认为是4K)。您可以设置数组,使得开头或结尾跨越页面边界(并保护该页面)。但是,要使两端都跨越这样的边界,当然需要非常具体的数组长度。
Here is一个如何设置警卫页面的例子。
答案 1 :(得分:1)
您可以在具有__attribute__((aligned (PAGESIZE)))
和mprotect
组合的UNIXish OS上执行此操作。在Windows上,我认为有一个等价于mprotect
,但它也仅限于一页内存。
无法以更精细的粒度保护事物的原因是内存访问是由硬件而不是软件完成的。如果每个内存访问需要通过一些数据结构来检查页面是否受到保护,那将会非常慢。
答案 2 :(得分:1)
不直接。您可以做的最接近的是在这些缓冲区上设置数据断点。但是,x86总共有4个这样的断点,它们最多只有8个字节。此外,您需要在ring 0(内核模式)中设置它们。
答案 3 :(得分:0)
我不认为这可以做到。你总是可以自己抛出异常。