ホームページ > 記事 > システムチュートリアル > Linux でのシステム コール プロセスの紹介
###### プロセス:######
まず第一に、アプリケーションはシステムが提供する API を直接呼び出すことができます。これはユーザー モード (Ring3) で実行できます。
その後、対応する API は対応するシステム コール番号を eax レジスタに保存し (このステップはインライン アセンブリを通じて実装されます)、次に int 0x80 を使用して割り込みをトリガーし (インライン アセンブリ)、割り込み処理関数に入ります (この関数は完全にアセンブリコードで記述されています)、この時点でカーネル状態(Ring0)に入ります。
割り込み処理関数では、システムコール番号に対応するシステムコールが呼び出されます。この関数では、2 つのレジスタ ds と es がカーネル空間を指すように設定されます。この方法では、ユーザー モードからカーネル モードにデータを転送することはできません (open(const char * filename, int flag, ...) のように、ファイル名ポインターが指す文字列のアドレスがユーザー空間にある場合、カーネル空間の対応する場所から文字列を取得すると、文字列はまったく存在しなくなります)、どうすればよいでしょうか?割り込みハンドラの fs レジスタはユーザー空間を指すように設定されているため、問題は解決されています。
システム コールでは、ファイルを開く、ファイルへの書き込みなど、対応する操作が実行されます。
処理後は割り込み処理関数に戻り、戻り値がeaxレジスタに格納されます。
割り込み処理関数から API に戻っても、戻り値は eax レジスタに保存されます。このとき、カーネルモードからユーザーモードに戻ります。
API の eax から値を取得し、対応する判断を行って、操作の完了を示す別の値を返します。
int 0x80 割り込みを使用して非常に多くのシステム コールを呼び出すことができるのはなぜですか?以上がLinux でのシステム コール プロセスの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。