4

syscall()を呼び出さないlibc関数があるかどうか知りたいですか?たとえば、libc関数 "strcpy()"の場合、任意のシステムコールを実行します(考えられるすべてのLinuxシステムについて考えてみましょう)。

4

2 に答える 2

5

システム コールは、カーネルへのコンテキスト スイッチを意味するため、パフォーマンスが非常に高くなります。strcpyしたがって、 (その機能は実質的に と同等ですが、アーキテクチャ用に最適化される可能性がある) のような単純なライブラリ関数の場合while(*d++ = *s++)、システム コールは意味をなさないでしょう。

コピー中にページ フォールトが発生すると、カーネル コンテキスト スイッチが発生し、システム コールが発生する可能性がありますが、これはシステムstrcpyコールを直接呼び出した結果ではないことに注意してください。

于 2012-10-07T00:36:50.543 に答える
4

システムコールは、ユーザーランド (プログラムが実行される場所) からカーネルランドへのインターフェースのようなものです。brkこれらは、ハードウェアとの通信 (ネットワーク カードからのバイトの読み取り、プロセスの開始、malloc (を使用) によるメモリの割り当てなど) など、カーネルだけが実行できることを行うときに必要です。

一方、 のようなユーザーランド関数は、strcpysyscall を実行するためにインデントされていません。ユーザーランドのプロセスのメモリ上で動作するだけで、特別な権限は必要ありません。

syscall はパフォーマンスに重大なペナルティをもたらすため (モードをユーザー ランドからカーネル ランドに変更したり、その逆に変更したりするのはコストがかかります)、頻繁に呼び出される関数のようなものをstrcpy使用することは、設計の観点からは意味がなく、そのようなものは見られそうにありません。

于 2012-10-07T00:26:23.470 に答える