13

x86 CPU では、制御レジスタ番号 0 があります。このレジスタの 16 ビット目は、「書き込み保護」設定を示します。このビットがクリアされている場合、CPU は読み取り専用データを上書きできます。(ページ テーブル エントリで構成) メモリ内。このビットが設定されている場合、CPU はメモリ内の RO データを上書きできません。

私が興味を持っているのは、「このビットの本来の目的は何ですか??」「なぜ x86 CPU にこれが必要なのですか??」

4

2 に答える 2

17

インテル®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すると、読み取り専用のユーザーページが変更されたときに(ページフォールトで)通知され、ページの変更に進む前にコピーオンライト操作を実行できます。

于 2013-03-07T17:22:47.550 に答える