페이지를 더티하게 만들기 위해 (페이지 테이블 항목에서 더티 비트로 전환) 다음과 같이 페이지의 첫 번째 바이트를 터치합니다.
pageptr[0] = pageptr[0];
그러나 실제로 gcc는 데드 스토어 제거에 의한 명령문을 무시합니다. gcc 최적화를 방지하기 위해 다음과 같이 문을 다시 작성합니다.
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
트릭이 작동하는 것처럼 보이지만 다소 추합니다. 동일한 효과를 갖는 지시문이나 구문이 있는지 알고 싶습니다. 그리고 나는 -O0
플래그 를 사용하고 싶지 않습니다 . 왜냐하면 그것은 또한 큰 성능 저하를 가져올 것이기 때문입니다.
답변
최적화를 해제하면 문제가 해결되지만 불필요합니다. 더 안전한 대안은 컴파일러가 volatile
형식 한정자 를 사용하여 저장소를 최적화하는 것을 불법으로 만드는 것 입니다.
// Assuming pageptr is unsigned char * already...
unsigned char *pageptr = ...;
((unsigned char volatile *)pageptr)[0] = pageptr[0];
volatile
컴파일러에 지시 타입 한정자는 메모리 저장 및로드에 대한 엄격합니다. 의 한 가지 목적은 volatile
메모리 액세스에 부작용이 있으므로 유지되어야 함을 컴파일러에 알리는 것입니다 . 이 경우 저장소는 페이지 오류를 유발하는 부작용이 있으며 컴파일러가 페이지 오류를 보존하기를 원합니다.
이렇게하면 주변 코드를 계속 최적화 할 수 있으며 코드를 GCC #pragma
또는 __attribute__
구문을 이해하지 못하는 다른 컴파일러로 이식 할 수 있습니다.
답변
당신이 사용할 수있는
#pragma GCC push_options
#pragma GCC optimize ("O0")
your code
#pragma GCC pop_options
GCC 4.4 이후 최적화를 비활성화합니다.
자세한 내용은 GCC 문서를 참조하십시오.
답변
새 pragma를 사용하는 대신 __attribute__((optimize("O0")))
필요에 따라 사용할 수도 있습니다 . 이는 동일한 파일에 정의 된 모든 기능이 아닌 단일 기능에만 적용하는 이점이 있습니다.
사용 예 :
void __attribute__((optimize("O0"))) foo(unsigned char data) {
// unmodifiable compiler code
}