すでに私この質問への回答としてしかし、システムコールとライブラリ機能の違いはよくわかりません。概念的には、2つの違いは何ですか?
答え1
概念的には、ライブラリ関数はプロセスの一部です。
実行時に実行コードとそのコードが依存するライブラリ(libc.soなど)のコードは単一のプロセスにリンクされます。したがって、これらのライブラリから関数を呼び出すと、その関数はプロセスの一部として実行され、同じリソースと権限を持ちます。これは、自分が書いた関数を呼び出すのと同じアイデアです(PLTおよび/またはトランポリン関数などの例外はありますが、興味がある場合は参照できます)。
概念的には、システムコールは、コード(通常は権限がない)からカーネル(必要に応じて権限を拡大する権限がある)を呼び出すために使用される特別なインタフェースです。
たとえば、Linuxを参照してください。マニュアル。 Cプログラムがmalloc
メモリ割り当てを呼び出すと、glibcのライブラリ関数が呼び出されます。
すでに割り当て可能なスペースが十分な場合プロセス内部、必要なヒープ管理を実行し、呼び出し元にメモリを返します。
それ以外の場合、glibcはカーネルからより多くのメモリを要求する必要があります。brk
glibc関数は(おそらく)brk
システムコールを呼び出します。システムコールを使用すると、制御がカーネルに渡された後にのみグローバル仮想メモリ状態を変更して、より多くのメモリを予約し、それをプロセスのアドレス空間にマッピングできます。
答え2
役に立たない答えを追加する:
ライブラリ関数はシステムコールよりも高速で、通常はプロセスの権限とメモリで実行されるため、権限/セキュリティに関する考慮事項は含まれません。
一方、システムコールはカーネルで実行されるため、システム内のすべてにアクセスできるため、呼び出し時に呼び出しプロセスが実行できる操作を制御する必要があります(たとえば、ファイルを開く権限があることを確認してください)。さらに、システムコールはカーネルに配置されているため、これを呼び出すにはCPUでコンテキスト切り替えが必要です。
システムコールは通常、モニタプログラムのシステムCPU使用率として反映されます。
答え3
ライブラリ呼び出し - (ライブラリを含めるか追加することによって)アプリケーションに接続されたサブルーチンへの呼び出し。
システムコール - オペレーティングシステムに制御を渡し(ユーザー - >システムプロセス - >オペレーティングシステム)、プロセッサを特権モードに切り替えます。
答え4
- lib funはコンパイラでサポートされていますが、syscallはオペレーティングシステムでサポートされています。
- Libcallは具体的で、syscallはgetcのように一般的です。 lib funは文字列や逐語ではなく一度に1つの文字にのみアクセスできますが、公開syscallはテキストファイル、バイナリファイル、およびより多くの種類の文書を開くために使用できます。