10

質問に対する答えが「いいえ」の場合、これを行うのが得策ではない理由は何ですか? カーネルは、カーネル モードで発生するページ フォールトを処理および修正できませんか? ページング可能なメモリを使用するコードが割り込みの下半分の一部としてのみ実行される場合、答えは変わりますか?

ありがとう!

4

2 に答える 2

6

Linux カーネルは、ページング可能な (スワップ可能な) メモリを独自のバッファーに使用できますか?

いいえ。「通常、カーネル モードで実行しているときにページ フォールトが発生すると、カーネル oops が発生します。ただし、例外もあります。ユーザー空間とカーネル空間の間でデータをコピーする関数は、その一例です。」(出典: https://lwn.net/Articles/270339/ )

なぜこれを行うのは良い考えではないのですか?

ユーザー スペースでは、ユーザー プロセスを単に一時停止して、問題を引き起こすことなく先に進むことができます。しかし、カーネル空間では、スレッドが多くのロックを取得しているか、割り込みを無効にしている可能性があります。ページ フォールトを取得するために停止する必要がある場合は、次の選択肢があります。

1)そのページがディスクからロードされている間、システム全体を何百万もの命令のために停止させます。これはひどいパフォーマンスにつながります。

2) 複雑さを追加して、いつでもロック/割り込みを「巻き戻す」ことができ、他のカーネルスレッドが続行できるようにします。

カーネルは、カーネル モードで発生するページ フォールトを処理および修正できませんか?

はい、障害が発生する可能性がありますが、特殊な場合のみです。つまり、「get_user_page」を呼び出すときにロックを設定することはできません。これにより、カーネルはユーザー モードにあるかのようにタスクから「切り替え」ます。割り込みをオフにしたり、ロックを解除したりした場合、カーネルの残りの部分は実行できませんでした。

ページング可能なメモリを使用するコードが割り込みの下半分の一部としてのみ実行される場合、答えは変わりますか?

いいえ。

質問の残りの半分は、「カーネルをページアウトできるようにすることで何が得られるか」です。一般に、カーネル メモリはメモリ全体のほんの一部です。

于 2014-06-08T17:01:37.500 に答える
2

カーネル メモリはスワップ可能ではなく、ページ フォールトを生成する唯一のカーネル メモリは vmalloc メモリです。

于 2013-12-08T23:34:29.387 に答える