Linuxを使用したCでシステムコールがどのように機能するかを理解しています。各プログラミング言語がカーネルと通信するための独自のシステムライブラリを持っているかどうかを知りたいです。
はいの場合、すべてのプログラミング言語に、カーネルと連携するための独自のシステムライブラリが必要ですか?
いいえの場合、Linuxで別のプログラミング言語のシステムコールはどのように機能しますか?
Linuxを使用したCでシステムコールがどのように機能するかを理解しています。各プログラミング言語がカーネルと通信するための独自のシステムライブラリを持っているかどうかを知りたいです。
はいの場合、すべてのプログラミング言語に、カーネルと連携するための独自のシステムライブラリが必要ですか?
いいえの場合、Linuxで別のプログラミング言語のシステムコールはどのように機能しますか?
AMD64 Linuxシステムコールでは、適切なレジスタをロードして関数を実行することで実行されsyscall
ます。他のアーキテクチャでは、これはもちろん異なります。
C以外の言語は、システムコールを行うC関数を外部から呼び出すか(通常は簡単で一般的です)、Cのように適切なプロセッサ命令を使用してシステムコールを行う必要があります。
システムコールは、ユーザースペースからカーネル常駐関数を実行するメカニズムです。
全体像は、システムコールがユーザースペース関数呼び出しにラップされていることです。この関数呼び出しは、ユーザーからの特定の引数を受け入れます。これらの引数は、実行するカーネル常駐関数を示すコードとともに、構造体にパックされます。次に、コードはCPU命令を実行して、その特権レベルをカーネルの特権レベルに上げると同時に、現在カーネル内にあるコードのパスを実行します。これは、カーネルへの入力と呼ばれます。カーネル内のこのコードは、システムコール用にアセンブルされたデータ構造にアクセスできます。ターゲットコードを見つけ、構造からコードの引数を設定し、呼び出しを行います。リターンコードを収集し、パスを逆にたどることによってユーザースペースに返されるように調整します。
アドレス空間の切り替えなど、途中で発生することは他にもありますが、これは概念的にはほとんど発生します。
Cは21世紀のOSの共通語であるため(ほとんどの主流のオペレーティングシステムは主にCで記述されているという意味で)、多くのプログラミング言語の実装はCコードを呼び出す方法を提供します。たとえば、JavaにはJNIがあり、PythonとRubyの両方のリファレンス実装(CPythonとCRuby)は、C拡張モジュールなどを作成する機能を提供します。
ほとんどの主流のオペレーティングシステム(Linuxを含む)は通常、デバイスとの直接のインターフェース、生成プロセスなどを行うために1つ以上の低レベルC APIを公開します。高レベル言語はこれらのシステムコールをラップし、言語レベルで利用できるようにすることができます。プログラマー。
Intelアーキテクチャでは、カーネルモード機能への呼び出しには、いくつかのパラメータ(Linuxのシステムコール番号およびその他の引数)による割り込みが含まれます。プログラミング言語がこれを利用したい場合は、適切なアセンブリ(たとえば、int 80)にコンパイルできる構造を提供する必要があります。
CとC++がこれを提供します。これを提供するために、ネイティブコードにコンパイルする他の言語も作成できます。一般に、RPC/COM呼び出しを使用してC/C++機能を呼び出す方が簡単です。
ほとんどの言語には、一般にと呼ばれるC関数呼び出しを呼び出す手段がありますForeign Function Interface
。私が出くわしたいくつかをリストしました:
Java - JNI
Python, Ruby, Perl, TCL - have extensions for directly calling native C code. Python also provides `ctypes`
Microsoft's CLR - P/Invoke a mechanism to invoke native platform code
まず、システムコールは、アセンブリを使用してカーネル(CPUが理解できる言語)を呼び出します。Cはアセンブリにコンパイルされます。x86でのシステムコールは、int0x80またはsysenterのいずれかを使用して実行されます。どちらもCPUによって実行されるアセンブリ命令です。カーネル自体もコンパイルされたコードです。コンパイルおよび解釈される2種類の言語があります。コンパイルされた言語はアセンブリにコンパイルされます-syscall実装でacライブラリを呼び出す、言語自体の独自のコードのレイヤー、一種の接着剤を持つことができます。または、アセンブリにコンパイルされるsyscallの独自の実装を持つことができます。解釈される言語は、ランダムな言語で記述されたコンパイル済みコードインタープリターですが、CPU上で実行されるものにコンパイルされます-同じ2つのオプションがありますが、インタープリターでは-バイトコードでもスクリプトコードでもありません。