1. ホーム
  2. c

[解決済み] C言語でgccが一部の文を最適化しないようにするには?

2022-07-06 23:50:56

質問

ページをダーティにする(ページテーブルエントリのダーティビットをオンにする)ために、私はこのようにページの最初のバイトをタッチします。

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__ の構文があります。