3

Linuxシステムコールについて基本的な質問があります。
システムコールが通常の関数呼び出しと同じように処理されないのはなぜですか?また、ソフトウェア割り込みを介して処理されるのはなぜですか?
これは、ユーザーアプリケーションのビルドプロセス中に、ユーザースペースアプリケーションとカーネルのリンクプロセスが実行されないためですか?

4

1 に答える 1

5

別々にコンパイルされたコード間のリンクは小さな問題です。共有ライブラリには、かなり前から回避策があります(再配置可能なコード、エクスポートテーブルなど)。プログラムにライブラリをロードするときに、通常は1回だけ費用を支払います。

より大きな問題は、CPUを非特権のユーザーモードから特権のあるカーネルモードに切り替える必要があり、ユーザーコードをエスケープしてカーネルに大混乱をもたらすことなく、制御可能な方法で切り替える必要があることです。そして、それは通常、特別なまたは指定された指示で行われます。また、カーネルに移行するときに自動割り込みを無効にすることでメリットが得られる場合があります。これは、x86int命令で実行できます。ほとんどのCPUにはこの命令のようなものがあり、これはシステムコールインターフェイスを実装する一般的な方法ですが、それだけではありません。

MS-DOSまたは元のMINIXについて質問した場合、どちらもリアルアドレスモードのi8086で実行され、すべてのメモリとシステムリソースにすべてのコードがアクセスできるため、カーネルはそれ自体または他のプログラムを何からも保護できませんでした。 、の場合、のような特別な命令を使用する理由は少なくなりintます。2つのモードはなく、1つだけであり、その点でintは、単純なとほぼ同等call (far)です。

また、CPUが次の3種類のイベントを非常によく似た方法で処理することが多いという事実も注目に値します。

  • I/Oデバイスからのハードウェア割り込み
  • 例外、コード実行によるエラー(たとえば、0による除算、ページフォールトなど)
  • システムコール

そのintため、上記のすべてのハンドラーの入口と出口のポイントは、完全ではないにしてもほぼ同じであるため、命令のようなものを使用するのが自然な選択になります。

于 2013-03-21T00:15:46.060 に答える