システムコールがユーザー空間でLinuxカーネルと対話する唯一の方法ですか?

システムコールがユーザー空間でLinuxカーネルと対話する唯一の方法ですか?

/ procファイルシステムなどの他のインターフェースはありますか?

答え1

LinuxカーネルシステムコールAPIはデフォルトのAPIであり(libcの下に隠されており、プログラマが直接使用することはほとんどありません)、ほとんどの標準IPCメカニズムはLinuxカーネルシステムコールAPIに大きく偏っています。すべてがファイルです最終的に読み取り/書き込み(およびそれ以上)呼び出しが必要なので、ここでは削除します。

ただし、ほとんどのプラットフォームには(すべてのシステムコールを除外する場合)、次の方法があります。VDSO。これは、カーネルが1つ以上のわずかに魔法のページを各プロセスにマッピングするメカニズムです(通常はELF .so形式)。 or と似てlinux-vdso.soいると考えてください。これはカーネルとユーザープロセス間の効果的なメモリマッピングIPCです(現在の実装では一方向ですが)。ldd/proc/PID/maps

システムコールを高速化するためによく使用され、もともと実装されました(linux-gate.so) x86 パフォーマンスの問題を解決するために使用されていますが、カーネルデータとアクセス機能も含めることができます。このような呼び出しは、代わりgetcpu()gettimeofday()以下を使用して行うことができます。実際システムコールとカーネルコンテキストスイッチ。これらの最適化呼び出しの可用性は、glibc起動コードによって検出され有効になります(プラットフォームの可用性によって異なります)。現在の実装には、直接読み取れる「VVAR」ページという共有カーネル変数の(読み取り専用)ページが含まれています。

コマンドの出力を確認して、コマンドが動作しているVDSOを使用して実行されていないシステムコールを実行していることをstrace -e trace=clock_gettime date確認できます。時間は、VDSOページの関数によってVVARSページから読み取られます。dateclock_gettime()arch/x86/vdso/vclock_gettime.c)。

以下は有用な技術の概要です。http://blog.tinola.com/?e=5詳細チュートリアル:http://www.linuxjournal.com/content/creating-vdso-colonels-other-chickenそしてマニュアルページ:http://man7.org/linux/man-pages/man7/vdso.7.html

答え2

いいえ。

簡単なカウンタの例はカーネルと対話します。

int main() {
    volatile char *silly = 0;
    *silly = 'a';
}

SIGSEGVその後、カーネルのページエラーハンドラが呼び出され、最終的にプロセスがコンパイルされます-O0

関連情報