2

OS呼び出しが実行されると、プロセスはコンテキストスイッチではなくモードスイッチのみを受けることを読みました。私の理解では、これによりプロセスの特権が昇格し、仮想アドレス空間にマップされているカーネル コードにアクセスできるようになります。(これには、トラップゲートを使用したセキュリティリングの変更が必要になると思います)。ただし、この OS 呼び出しで IO を実行する場合は、ページ キャッシュを使用する必要がある場合があります。コンテキストスイッチなしでこれはどのように起こりますか? それとも、ページ キャッシュもすべてのプロセスの仮想アドレス空間にマップされていますか?

上記の説明のいくつかは間違っている可能性があります。私がそうなら、私を修正してください。私はこれをつなぎ合わせようとしています。また、Linux カーネルにも興味があります。

4

2 に答える 2

1

簡単な説明:

カーネル モードに変更しても、ページ マッピングは変更されません。ただし、カーネル自体のメモリ空間にアクセスできるようになります (リングの変更により)。カーネル モードの場合でも、プロセスのユーザー空間メモリにアクセスできます。したがって、標準の I/O 呼び出しでは何もする必要がなく、ユーザー空間に直接アクセスできます。ただし、多くの場合、渡されたポインタがマップされていないメモリ、ページアウトされたメモリを指している、または呼び出しの途中で消える可能性があるため、これは良い考えではありません。したがって、通常はcopy_to_usercopy_from_userが使用されます。

メモリ マップを変更するシステム コールがいくつかある場合があります。たとえばfork()、ページ マップの CoW コピーを作成します。exec友人はページをディスク上の実行可能ファイルに再マップします。ただし、これらは例外です。

また、システムコールによってコンテキストが切り替わる場合があります。たとえば、sleep()ほぼ保証されています。ただし、これは呼び出し元プログラムのメモリにアクセスするためのものではありません。

于 2015-02-02T22:51:10.070 に答える