私はこの質問の答えは出ましたが、システムコールとライブラリ関数の違いをよく理解していません。概念的には、2つの違いは何ですか?
私はこの質問の答えは出ましたが、システムコールとライブラリ関数の違いをよく理解していません。概念的には、2つの違いは何ですか?
回答:
概念的には、ライブラリ関数はプロセスの一部です。
実行時に、実行可能コードとそれが依存するライブラリ(libc.soなど)のコードは、単一のプロセスにリンクされます。したがって、そのようなライブラリで関数を呼び出すと、同じリソースと権限でプロセスの一部として実行されます。これは、自分で作成した関数を呼び出すのと同じ考え方です(PLTやトランポリン関数などの例外はありますが、必要に応じて検索できます)。
概念的には、システムコールは、コード(通常は特権を持たない)からカーネル(必要に応じて特権を昇格させる権限を持つ)への呼び出しに使用される特別なインターフェイスです。
たとえば、Linux man brkを参照してください。Cプログラムがmalloc
メモリを割り当てるために呼び出すとき、それはglibcのライブラリ関数を呼び出しています。
プロセス内の割り当てに十分なスペースがすでにある場合は、必要なヒープ管理を行い、メモリを呼び出し元に返すことができます。
そうでない場合、glibcはカーネルからより多くのメモリを要求する必要があります。それは、おそらくbrk
sysbccallを呼び出すglibc関数を(おそらく)呼び出しbrk
ます。syscallを介して制御がカーネルに渡されると、グローバル仮想メモリの状態を変更してより多くのメモリを予約し、プロセスのアドレス空間にマップすることができます。
役に立たない答えに追加:
ライブラリ関数はシステムコールよりも高速であり、プロセスの特権とメモリで実行されるため、通常、権限/セキュリティに関する考慮事項は含まれていません。
一方、syscallはカーネルで実行され、システム内のすべてにアクセスできるため、呼び出し時に呼び出しプロセスが実行できることを制御する必要があります(ファイルを開く権限があることを確認してください)例)さらに、syscallはカーネル内にあるため、それらを呼び出すには、CPUでのコンテキストスイッチが必要です。これは、ライブラリ呼び出しを呼び出すだけに比べて非常に重いプロセスです。
シスコールは通常、監視プログラムのシステムCPU使用率として反映されます。
ライブラリ呼び出し-アプリケーションにリンクされたサブルーチンを呼び出します(ライブラリの追加または追加を介して)。
システムコール-OSに制御を移し(ユーザー->システムプロシージャ-> OS)、プロセッサを特権モードにします。