0

C では、自分のものではないメモリに書き込もうとすると、セグメンテーション違反が発生する可能性があります。(技術的には、自分のものではないメモリに書き込もうとしたときの動作は定義されていませんが、OS がそのような状況を処理できる方法の 1 つは、segfault をスローすることです)。不正なメモリ アクセスを試みるユーザー空間コードの場合、カーネルが不正なメモリ アクセスを検出し、segfault をスローします。

現在、Linux カーネル モジュールを作成しています。私のコードはカーネル空間で実行されます。関連する質問が 2 つあります。

  1. 配列の境界を超えると、コードでセグメンテーション違反が発生します。このセグメンテーション違反を検出しているものを知りたいですか? ユーザー空間アプリケーションの場合、カーネルはセグメンテーション違反を検出します。カーネルコード自体はどうですか? カーネルコードで範囲外のメモリアクセスを検出するのは何ですか?

  2. 私が書いたカーネル モジュールと insmod は別のプロセスとして実行されますか? はいの場合、モジュールのセグメンテーション違反時にカーネル全体でセグメンテーション違反が発生するのはなぜですか? 私のモジュールだけが segfault せず、残りのカーネルは実行し続けるのはなぜですか?

このチュートリアルのセクション 3.1.5 を読んでいます: http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html

4

2 に答える 2

6

高水準言語とは異なり、メモリ アクセスは C のハードウェアと直接やり取りします。ロードは次の命令になりますmov %reg, [address]。そして店舗はこうなりますmov [addr], value。OS はこの命令の実行に直接関与しないため、不正なアクセスはプロセッサによってキャッチされます。x86 が読み取り専用マッピングへの書き込みにどのように応答するかを次に示します ( Intel ソフトウェア開発者マニュアルから)。

MOV—Move
...
Protected Mode Exceptions
...
#GP(0) If the destination operand is in a non-writable segment.
...

ハードウェアが不正なアクセスを検出するために、OS はページ テーブルを保持します。ユーザー空間と同様に、カーネル モードにもメモリ マッピングがあります。マッピングの範囲外のアクセスは例外を生成し、OS 内のハンドラーを呼び出します。

詳細については、これらのマニュアルのVol.2 Chapter 4: Pagingを参照してください。

于 2015-06-05T18:45:40.163 に答える