为了使页面变脏(打开页面表条目中的脏位),我触摸页面的第一个字节,如下所示:

pageptr[0] = pageptr[0];

但是实际上,gcc将通过消除死存储来忽略该语句。为了防止gcc对其进行优化,我将语句重写如下:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;

看起来the俩有效,但有些丑陋。我想知道是否有任何指令或语法具有相同的效果?而且我也不想使用-O0标志,因为它也会带来很大的性能损失。

最佳答案

关闭优化可解决此问题,但这不是必需的。一种更安全的选择是使编译器使用volatile类型限定符来优化存储空间是非法的。

// Assuming pageptr is unsigned char * already...
unsigned char *pageptr = ...;
((unsigned char volatile *)pageptr)[0] = pageptr[0];
volatile类型限定符指示编译器对内存存储和加载严格。 volatile的目的之一是让编译器知道内存访问有副作用,因此必须保留。在这种情况下,存储具有导致页面错误的副作用,并且您希望编译器保留页面错误。

这样,仍然可以优化周围的代码,并且您的代码可以移植到其他不理解GCC的#pragma__attribute__语法的编译器中。

10-08 11:35