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