/ 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ページから読み取られます。date
clock_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
)