システムコールが必要なときにLinuxカーネルがアセンブリ言語で部分的に書き込まれるのはなぜですか? [閉鎖]

システムコールが必要なときにLinuxカーネルがアセンブリ言語で部分的に書き込まれるのはなぜですか? [閉鎖]

カーネルはシステムコールを使用しませんか、それとも以前に新しいシステムでアセンブリが組み立てられましたか?おそらくアセンブラに関する追加情報が必要になるでしょうが、mov [register]などのコマンドがシステムコールである場合、OS依存カーネルを参照せずにどのように使用できるか混乱しています。

たとえば、アセンブラを作成してシステムコールを使用するためにGNU / Linuxディストリビューションを使用しているとします。 Linuxにシステムコール用のカーネルがない場合、アセンブリ自体をどのように使用できますか?

答え1

mov [register]同様に、システムコールではなくアセンブリコマンドです。

システム呼び出しは、基本的にプロセッサに組み込まれ、呼び出されたサブルーチンが通常のユーザー空間プログラムコードよりも高い特権レベルを持つように、カーネルによって設定されたメカニズムを使用してカーネルから特定のサブルーチンを呼び出すユーザー空間プログラムです。

組み立て手順は、基本的に機械語コードの実際のバイトを人間に優しく表現したものです。機械語コードは解釈またはコンパイルされませんが、プロセッサマイクロコードを使用してプロセッサ内で実装されるか、多数の論理ゲートを使用してハードウェアレベルで直接実装されます。

アセンブリ言語の単一システムコールは、通常、複数行のコードです。まず、システムコールのパラメータが適切なプロセッサレジスタおよび/またはスタックにロードされ、次のようなint 0x80特殊命令がsyscall実際にシステムコールを作成するために使用されます。

32ビットx86アーキテクチャでint 0x80システムコール命令として使用されます。カーネルは、プロセッサ用のソフトウェア割り込み処理ルーチンテーブルを準備します。このテーブルは通常のユーザー空間コードとして直接アクセスできませんが、intテーブルが指すルーチンの1つはユーザー空間コードを使用してトリガーできます。int 0x80プロセッサにカーネルモードに切り替えて、テーブルのスロット#128にあるアドレスを持つルーチンにジャンプするように指示するだけです。このルーチンは、Linux 32ビットx86アーキテクチャ用のシステムコールインターフェイスです。指定された引数を確認して呼び出したプロセスを識別し、適切なサブルーチンにジャンプします。

syscall64ビットバージョンのx86アーキテクチャには、同じ目的のための専用命令があります。実際には32ビットx86アーキテクチャにも今はありますが、リヌス・トバルズが32ビットLinuxシステムコールルールを設計する当時は存在しなかったか、一部のプロセッサモデルで命令にハードウェアバグがあって使用していない。それに。ただし、すべての64ビットx86プロセッサにはこのsyscall命令があり、機能するため、これを使用してください。

関連情報