5

最近、コンパイラ、標準ライブラリ、およびカーネルの内部動作に興味を持ちました。標準 C ライブラリのソースコードを探していたところ、Glibc に出会いました。しかし、Glibc の公式ウェブサイトには次のように書かれています。the library which defines the ''system calls'' and other basic facilities such as open, malloc, printf, exit...

つまり、Glibc は実際には標準 C ライブラリのソース コードを提供するのではなく、代わりにそれらの関数のシステム コールを提供し、カーネルがそれらを処理するのではないでしょうか?

それらについてもっと学びたいと思います。たとえば、、、、および関数は C プログラムでどのように実行されるのでしょうかsin。Glibc がシステム コールだけを提供している場合、それらの関数の実際のソース コードはどこにありますか? カーネルはどのようにそれらを実行しますか? これらの機能を実行するカーネル部分のソース コードはどこにありますか?printfstrlen

4

3 に答える 3

5

C ライブラリは、他のライブラリとほとんど同じユーザーランド ライブラリです。

システム コールは、カーネルが提供するインターフェイスです。C 標準とは何の関係もありません。これらは OS 固有です。UNIX ライクなオペレーティング システムにはいくつかの類似点がありますが、それは別のトピックです。

C ライブラリに実装されている関数の中には、システム コールを何らかの方法で呼び出してしまうものがあります。しかし、それは他のライブラリとまったく同じです。

OpenBSD の C ライブラリを見ることをお勧めします。Androidフォンもそれを使用します。シンプルで明確で、非常によく文書化されています。ここで見つけることができます。

于 2012-11-01T14:34:12.813 に答える
1

glibc は、ライブラリ関数のコードを提供し、syscall 定義も提供します。提供されている関数のごく一部だけが、実際には syscall です。他のものはライブラリ内にコードを持ち、すべての作業を内部で行うか、内部で呼び出してカーネルに委譲します。さまざまな libc ソースの内部を見て、それらがどのように機能するかを確認できます。Glibc、Eglibc、Newlib、Dietlibc などのソースが用意されています。

libc 呼び出しのシステム コールを持つ OS を持つことは可能ですが、多くの理由で実行されていません。

于 2012-11-01T14:34:55.127 に答える
0

このページでシステム コールの感触をつかむことができます。古いものですが、呼び出しが実装されているカーネル内のファイルへのアイデアとポインターを提供します。典型的な UNIX システムには数百のシステム コールがあります。たとえば、sys_open または sys_write を確認できます。fopen や open などの呼び出しを見ると、結局のところ、それらはすべて sys_open にマップされます。printf や write マップなどは sys_write にダウンします。

カーネルはファイルへのアクセスなどを仲介するため、チョーク ポイントである必要がありますが、ライブラリは、これらの呼び出しを便利な抽象化 (多くの場合、1 つのシステム コールに対して複数) でラップすることにより、アクセスを容易にします。libraray 自体はシステム コールを提供しません。システム コールをセットアップしてから、それらを実装するカーネルにトラップします。システムコールは事実上、libc プログラムが対象とするカーネルの API です。

strlen などの一部の呼び出しは、カーネル アクセスをまったく必要としません。その呼び出しは、既に割り当てられているメモリを参照するだけです。

ユーザー空間からこれを調べるための優れたツールはstraceです。プログラムを指定すると、そのプログラムが行うすべてのシステム コールが表示されます。これを使用して、libc 呼び出しがシステム呼び出しにどのようにマップされるかを調べることができます。

于 2012-11-01T14:34:17.997 に答える