回答:
システムコールはカーネルによって直接処理されます。
ライブラリー呼び出しは、動的(または静的にリンクされた)ライブラリーによって処理されます。ライブラリ呼び出しを行うプログラムは、呼び出しが機能する前に、まずそのライブラリをインポートする必要があります。ライブラリコール自体は、システムコールを使用できます。
ライブラリがシステムコールの「フロントエンド」として提供され、カーネルでは提供されない追加機能や使いやすさを提供する場合があります。
基本的に、Linuxカーネルには2つのモードがあります。
Linuxカーネルは、これら2つのモード間を自動的に切り替えます。一般に、ライブラリ呼び出しはユーザーモードで実行され、システム呼び出しはカーネルモードで実行されます。オペレーティングシステムの用語では、カーネルモードは本質的にアトミックであり、監視モードです。 ほとんどすべてのライブラリ呼び出しは、そのタスクを実行するためにカーネルの助けを必要とします。各ライブラリー呼び出しは、基礎となるシステム呼び出しを順番に呼び出します。次の例を使用して、アイデアをより明確にします。
cプログラムでは、ヘッダーファイルからfopen()を使用します。プログラミング環境は、カーネルからシステムコールopen()を呼び出し、ファイルを開くタスクを実行します。実行後も、制御フローはユーザーモードに戻ります。
これを説明するには、次のタスクを実行します
man man
:ここでは、1〜8のマニュアルセクションにそれぞれ特定の目的があります。man fopen
:としてポーズが表示されますFOPEN(3)
。ここで3は、Cライブラリ呼び出しセクションであるマニュアルページのマニュアルセクション3を示します。実行man open
:OPEN(2)
ここで2はシステムコールセクションであるマニュアルページのマニュアルセクション2を示します。
概念を理解してください。
他の回答でここで言及した違いに追加するだけです。
ライブラリ呼び出しは単なる関数呼び出しであるため、ユーザー空間からカーネル空間への切り替えは発生しません。一方、システムコールはカーネルモードで動作するため、システムコールはユーザー空間からカーネル空間に切り替わります。