3

数日前に OS の概念の勉強を始めましたが、すでにいくつかの問題を抱えています。主にシステムコールにとても興味があります。私は、各オペレーティング システムがそれぞれ独自の API を提供していることを知りました (Windows API 用の Windows、libc 用の Linux など)。

私が混乱し始めているのはラッパー関数です。たとえば、Linux には fork() ラッパー関数があります。これは、この関数内のアルゴリズムが OS のシステム コール テーブルに基づいてシステム コール ルーチンを実行するということですか? Cで書かれているという意味がわかりません.C標準ライブラリを使用しているということですか? それともCコンパイラだけですか?さらに、GCC Windows C コンパイラなどのさまざまな種類のコンパイラがあるにもかかわらず、C コンパイラが標準ライブラリをコンパイルするのはなぜですか? 私が気になっているのは、C 標準ライブラリ関数もシステム コールを呼び出しているということです。しかし、異なるOSで同じ出力を得るために、異なるシステムコールを呼び出す必要があるかもしれませんよね? これは、同じ標準 C 関数でも、OS ごとに内部に実装されているシステムコールが異なるということでしょうか。

システムコールplzの良いコンセプトが本当に欲しいです:)

4

3 に答える 3

3

システム コールは、基盤となるオペレーティング システムによって公開される機能です。通常、言語がシステム コールを発行する方法は明確に定義されています。たとえば、Intel x86 プロセッサにsyscallは使用される命令がありますが、割り込み命令を発行するなど、他の手段を使用することもできます。

システム コールが実行されると、ユーザー空間からより特権レベルで実行されるカーネル空間に移行します。システム コールの引数はカーネル スペースにコピーされ、検証されて、カーネルが危険にさらされていないことが確認されます。ただし、パラメーターがユーザー空間でも検証された可能性は非常に高いです。場合によっては、ユーザー空間関数がカーネル関数のシン ラッパーになることもあれば、その上に追加機能を提供することもあります。

C と Unix には密接な伝統があります。そのため、多くのシステム コール名が C バージョンと同じです (fork、execXXX など)。ただし、これは単なる規則であり、すべての場合に当てはまるわけではありません。Windows では、システム コールの名前は Linux のものとはまったく異なります。ただし、プラットフォーム上の基盤となる C ランタイムの実装により、これが隠され、C 関数が提供する機能を実現するための正しいシステム コールが作成されます。

通常、Ruby のような高水準言語は、システム コールを直接発行しません。代わりに、低レベル言語 (C や C++ など) で記述されたライブラリを使用して、Ruby 呼び出しを基になるシステム関数の呼び出しに変換しています。

于 2013-07-26T15:40:14.913 に答える