为了使页面变脏(打开页表条目中的脏位),我像这样触摸页面的第一个字节:
pageptr[0] = pageptr[0];
字符串但在实际中,GCC会通过死存储消除来忽略该语句,为了防止GCC优化它,我将该语句重写如下:
volatile int tmp; tmp = pageptr[0]; pageptr[0] = tmp;
型看起来这个技巧很有效,但是有点丑陋。我想知道是否有任何指令或语法具有相同的效果?我不想使用-O 0标志,因为它也会带来很大的性能损失。
mzmfm0qo1#
您可以使用
#pragma GCC push_options #pragma GCC optimize ("O0") your code #pragma GCC pop_options
字符串从GCC 4.4开始禁用优化。如果你需要更多的细节,请参阅GCC文档。
mxg2im7a2#
除了使用新的pragmas,你也可以根据自己的需要使用__attribute__((optimize("O0")))。这有一个优点,那就是只应用于单个函数,而不是同一个文件中定义的所有函数。使用示例:
__attribute__((optimize("O0")))
void __attribute__((optimize("O0"))) foo(unsigned char data) { // unmodifiable compiler code }
字符串
uidvcgyl3#
关闭优化可以解决这个问题,但这是不必要的。一个更安全的选择是让编译器使用volatile类型限定符优化存储区是非法的。
volatile
// Assuming pageptr is unsigned char * already... unsigned char *pageptr = ...; ((unsigned char volatile *)pageptr)[0] = pageptr[0];
字符串volatile类型限定符指示编译器严格控制内存存储和加载。volatile的一个目的是让编译器知道内存访问有副作用,因此必须保留。在这种情况下,存储有导致页面错误的副作用,并且您希望编译器保留页面错误。这样,周围的代码仍然可以被优化,并且您的代码可以移植到其他不理解GCC的#pragma或__attribute__语法的编译器。
#pragma
__attribute__
3条答案
按热度按时间mzmfm0qo1#
您可以使用
字符串
从GCC 4.4开始禁用优化。
如果你需要更多的细节,请参阅GCC文档。
mxg2im7a2#
除了使用新的pragmas,你也可以根据自己的需要使用
__attribute__((optimize("O0")))
。这有一个优点,那就是只应用于单个函数,而不是同一个文件中定义的所有函数。使用示例:
字符串
uidvcgyl3#
关闭优化可以解决这个问题,但这是不必要的。一个更安全的选择是让编译器使用
volatile
类型限定符优化存储区是非法的。字符串
volatile
类型限定符指示编译器严格控制内存存储和加载。volatile
的一个目的是让编译器知道内存访问有副作用,因此必须保留。在这种情况下,存储有导致页面错误的副作用,并且您希望编译器保留页面错误。这样,周围的代码仍然可以被优化,并且您的代码可以移植到其他不理解GCC的
#pragma
或__attribute__
语法的编译器。