5

本の一節です

カーネル コードを実行する場合、システムはカーネル空間でカーネル モードで実行されます。通常のプロセスを実行する場合、システムはユーザー モードで実行されるユーザー空間で実行されます。

さて、カーネルコードとユーザーコードとは何でしょう。誰かが例で説明できますか?

このアプリケーションを実行しprintf("HelloWorld")ているときに、ユーザーコードまたはカーネルコードになるアプリケーションがあるとします。

ある時点で、ユーザーコードがカーネルモードに切り替わり、カーネルコードが引き継ぐと思いますが、これに出くわしたので、常にそうであるとは限りません.

たとえば、open() ライブラリ関数は、open() システム コールを呼び出す以外にはほとんど何もしません。strcpy() などのさらに他の C ライブラリ関数は、カーネルを直接使用しないようにする必要があります (1 つは希望します)。

カーネルを使用しない場合、どのようにしてすべてを機能させるのでしょうか?

誰かが全体を明快に説明してくれませんか。

4

1 に答える 1

5

カーネル コードとユーザー コード自体には大きな違いはありません。コードはコードです。カーネル モードで実行されるコード (カーネル コード) には、カーネル モードでのみ実行可能な命令を含めることができます (実際に含めます)。ユーザーモードでは、そのような命令は実行できません (信頼性とセキュリティ上の理由から許可されていません)。通常、例外が発生し、その結果としてプロセスが終了します。

特に RAM 以外の外部デバイスを使用した I/O は、通常、何らかの方法で OS によって実行され、システム コールは、I/O を実行するコードに到達するためのエントリ ポイントです。そのため、システム コールopen()printf()使用して、カーネルのどこかにある I/O デバイス ドライバーでそのコードを実行します。汎用 OS の要点は、ユーザーやプログラマーからハードウェアの違いを隠すことです。そのため、この種のネットワーク カードやその種のディスプレイやデバイスへのアクセスについて知ったり考えたりする必要はありません。ディスク。

メモリ アクセス、OTOH は、ほとんどの場合、OS の介入なしで発生する可能性があります。そしてstrcpy()、そのまま動作します: メモリのバイトを読み取り、メモリのバイトを書き込みます。ああ、それはゼロバイトでしたか? そうでない場合は繰り返し、そうでない場合は停止します。

「ほとんどの場合」と言ったのは、ページ変換と仮想メモリが関係し、メモリアクセスがカーネルに切り替えられる可能性があるためです。そのため、カーネルはディスクからメモリに何かをロードし、切り替えを引き起こしたアクセス命令を続行させることができます.

于 2012-10-13T15:04:49.430 に答える