2012-02-08 24 views
4

C標準ライブラリのどの関数がシステムコールを行うかを知る方法はありますか? openclose、およびmallocのようなものもありますが、そこには何らかの種類のリストがありますか?たとえば、strcpyのようにシステムコールを作成するか、time.hのいずれかの関数を作成しますか?C標準ライブラリとシステムコール

+2

これは、実装に依存する可能性が高いです。あなたが興味を持っている特定のシステムはありますか? – templatetypedef

+0

ええ、それは私が恐れているものです。 : – theshadow322

+0

malloc()は必ずしもシステムコールを行うわけではありません。 – tristan

答えて

7

多くの場合、実行時間はシステムコールによって完全に支配されるため、パフォーマンスの観点から質問していると仮定します。

これはインプリメンテーションに依存しますが(システムコールが存在するかどうかはインプリメンテーションに依存します)、推論を推し進め、推測するには "システムコール"カーネルからユーザへの "権限の移行は、それが本当にすべてのシステムコールであるからです。

strcpyの例を考えてみましょう。これは、ある配列(プロセスのメモリ空間内)から別の配列(メモリ空間内)に文字列をコピーします。それ以外のデータは含まれていないので、この操作の一環としてカーネル空間に入るのはかなり病理学的なことです。

一方、timeの機能をtime.hから考えてみます。現在のシステム時間を返します。これは共有システムリソースなので、カーネルの現在の時刻の記録を読み込むためにカーネルスペースに入る必要があると考えられます。そして伝統的に、あなたは正しいでしょう。しかし現代版のLinuxは、少なくともいくつかのアーチでは、カーネルメモリのページをすべてのユーザプロセスに読み取り専用でマップします。ページには、システム時刻のようにカーネルだけが更新できる特定の情報が含まれていますが、プロセスは秘密のデータを漏らすことなく自由にユーザー空間から読み取ることができます。だから、これはもっと曖昧です。

は最後に、あなたは彼らが権限を施行する必要がある上の共有リソース(ファイルシステム)に対処するため必ずしもユーザ対カーネル・ツー・ユーザーの移行を伴わなければならないことopenまたはunlinkなどの事業を展開しています。

あなたの質問に答えるより実践的なアプローチが必要な場合は、興味のある各機能を呼び出す短いプログラムを作成し、straceの下で実行するだけです。

+0

'open'でもカーネルの移行は必ずしも必要ではありません。コンソールファイルハンドル(例えば「CONIN $」)を開いた場合、Windowsの古いバージョンでは、ユーザー・モード・スタブから返された(「現在のコンソールの入力ストリーム」を意味する)一定のハンドルを取得したいです。これがまだ真実かどうかはわかりません。 – arx

+0

私は、POSIXに準拠 'open'のバージョンを想定しました。すでに開いて1に一致するファイルディスクリプタを返すされてどこにも近くに準拠... –

1

システムコールは、プログラムがカーネルと通信する必要がある場合に行われます。 strcpyがシステムコールを行うのは非常に効率的ではないでしょう。コードが実行を停止し、コンテキストスイッチがあり、CPUの実行モードが変更され(より多くの権限を持つために)、インターハンドラハンドラが実行され、コードが続行されます。これは、OSがあなたのコードを混乱させた後や別のプロセスを実行することを決して決してしないと仮定しています(例えば、読み込みを待っている間)。

自分自身にこの質問をすることで、自分自身で質問に答えることができます:この機能を書くことはできますか? (実際には可能ですか?)自分でstrcpyを書くことはできますが、開いたり読むことはできません。あなた自身のfopenを書くことができますが、openを呼び出さなければなりません。

ウィキペディアにはlist of catagories for system callsがあります。システムコールがいつ必要になるかをあなたに教えてくれます。

Thisは、アセンブリでインターウォップを呼び出す方法を示しています(これは、そうするコードに到達できる唯一の場所です)。

+0

+1は、私は「私はこの関数を記述することはできますか?」が好き教育ツールとしてのアプローチ私が与えた 'time'の例が完全には機能しないコーナーケースに注意してください。あなたが知っている場合(カーネルはこのようにあなたは、カーネルが提供するコードを使用する必要があります。ユーザ空間メモリ内の必要なデータをマッピングして、フォーマットを知って、あなたは 'time'を書く「でした」が、カーネルの詳細は変更することができますので、それは壊れやすいだろうあなたがシステムコールを避けたい場合) –

関連する問題