为了使页面变脏(打开页表项中的脏位),我触摸页面的第一个字节,如下所示:
pageptr[0] = pageptr[0];
Run Code Online (Sandbox Code Playgroud)
但在实践中,gcc将忽略死店淘汰的陈述.为了防止gcc优化它,我重新编写语句如下:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
Run Code Online (Sandbox Code Playgroud)
似乎这个伎俩有效,但有点难看.我想知道是否有任何指令或语法具有相同的效果?而且我不想使用-O0旗帜,因为它也会带来很大的性能损失.
Plo*_*low 172
您可以使用
#pragma GCC push_options
#pragma GCC optimize ("O0")
your code
#pragma GCC pop_options
Run Code Online (Sandbox Code Playgroud)
自GCC 4.4以来禁用优化.
如果您需要更多详细信息,请参阅GCC文档.
FRo*_*Rob 120
您也可以__attribute__((optimize("O0")))根据自己的需要使用新的pragma,而不是使用新的pragma .这具有仅应用于单个函数而不是应用于同一文件中的所有函数的优点.
用法示例:
void __attribute__((optimize("O0"))) foo(unsigned char data) {
// unmodifiable compiler code
}
Run Code Online (Sandbox Code Playgroud)
Die*_*Epp 82
关闭优化可以解决问题,但这是不必要的.更安全的替代方法是使编译器通过使用volatile类型限定符来优化存储是非法的.
// Assuming pageptr is unsigned char * already...
unsigned char *pageptr = ...;
((unsigned char volatile *)pageptr)[0] = pageptr[0];
Run Code Online (Sandbox Code Playgroud)
该volatile类型限定符指示编译器要严格有关内存存储和加载.一个目的volatile是让编译器知道内存访问有副作用,因此必须保留.在这种情况下,存储具有导致页面错误的副作用,并且您希望编译器保留页面错误.
这样,周围的代码仍然可以进行优化,并且您的代码可以移植到其他不了解GCC #pragma或__attribute__语法的编译器.