x86 CPU では、制御レジスタ番号 0 があります。このレジスタの 16 ビット目は、「書き込み保護」設定を示します。このビットがクリアされている場合、CPU は読み取り専用データを上書きできます。(ページ テーブル エントリで構成) メモリ内。このビットが設定されている場合、CPU はメモリ内の RO データを上書きできません。
私が興味を持っているのは、「このビットの本来の目的は何ですか??」「なぜ x86 CPU にこれが必要なのですか??」
x86 CPU では、制御レジスタ番号 0 があります。このレジスタの 16 ビット目は、「書き込み保護」設定を示します。このビットがクリアされている場合、CPU は読み取り専用データを上書きできます。(ページ テーブル エントリで構成) メモリ内。このビットが設定されている場合、CPU はメモリ内の RO データを上書きできません。
私が興味を持っているのは、「このビットの本来の目的は何ですか??」「なぜ x86 CPU にこれが必要なのですか??」
インテル®64およびIA-32アーキテクチャーからの引用ソフトウェア開発者マニュアル第3巻Apg。2-15(エンファシスマイン):
WP書き込み保護(CR0のビット16)—設定すると、スーパーバイザーレベルのプロシージャが読み取り専用ページに書き込むことを禁止します。クリアすると、スーパーバイザーレベルのプロシージャが読み取り専用ページに書き込むことができます(U / Sビット設定に関係なく。セクション4.1.3およびセクション4.6を参照)。このフラグは、UNIXなどのオペレーティングシステムで使用される新しいプロセス(フォーク)を作成するコピーオンライト方式の実装を容易にします。
更新:fork()でウィキペディアを見てください:
プロセス(親または子)がページを変更するときはいつでも、その特定のページの個別のコピーだけが、変更を実行したそのプロセス(親または子)に対して作成されます。
これはコピーオンライトの中核ですが、カーネルによって変更が行われる場合(syscallの結果として書き込みが発生する場合など)に問題が発生します-think read()
)。
4.1.3から:
CR0.WPを使用すると、ページをスーパーバイザモードの書き込みから保護できます。CR0.WP = 0の場合、スーパーバイザモードの書き込みアクセスは、読み取り専用アクセス権を持つリニアアドレスに許可されます。CR0.WP = 1の場合、そうではありません。(CR0.WPの値に関係なく、読み取り専用アクセス権を持つ線形アドレスへのユーザーモードの書き込みアクセスは許可されません。)
カーネルを設定CR0.WP = 1
すると、読み取り専用のユーザーページが変更されたときに(ページフォールトで)通知され、ページの変更に進む前にコピーオンライト操作を実行できます。