私はすべてのプログラムがvdsoライブラリへのgccリンクにコンパイルされていることを発見しました。 mmap()、fork()、その他のシステムコールなどのカーネルへのシステムコールを含むライブラリですか?
システムコールはGNU C標準ライブラリの機能ではないため、オブジェクトコードは、コンパイル時にアプリケーションに関連付けられているいくつかのライブラリに存在する必要があることを知っています。
だからvdsoはそのライブラリですか?
答え1
答えで述べたように、システムコールはカーネルに実装されています。フォローアップの質問。仮想動的共有オブジェクトvDSOは小さな仮想ライブラリです。返品すべてのプロセスにマップされるカーネルによって実装されます。システムコールと同様に、Cライブラリによってラップされます。
システムコールとvDSOの主な違いの1つは特権です。システムコールはカーネル空間で実行され、ユーザ空間とカーネル空間を切り替えるのに費用がかかる。最適化として、vDSOは実際にカーネル空間で実行する必要がないいくつかのシステムコールを提供しますが、vDSOはユーザー空間で実行されます。一例は、gettimeofday
頻繁に呼び出される傾向があり、カーネル空間に切り替えることなくカーネルによって実装できることです。
これvdso
マンページに詳細があります。 vDSOを含むLinuxの一般的なシステムコールの詳細については、次を参照してください。システムコール分析 パート1そしてパート2。