コメントを見て、これを試してみましょう。システム サービスは、昇格された特権 (通常はカーネル モード) で実行される手順です。それ以外はすべてライブラリ呼び出しです。
基盤となるハードウェアは、ユーザー アプリケーションがカーネル モードに入るゲートを提供します。オペレーティング システムは、基本的なシステム セキュリティのためにこのゲートを保護します。
ここで少し単純化します --- プロセッサで使用される一般的な方法は、プロセスが明示的に例外をトリガーすることです (Intel には別の SYSCALL メソッドがあります)。
システムには、例外または割り込み (ページ フォールト、ゼロ除算など) に応答するための一連の割り込み/例外ベクトル (ハンドラー プロシージャへのポインター) があります。システムは、ハードウェアの例外と割り込み用にベクトルのセット (通常は番号の小さいもの) を定義します。ただし、通常はオペレーティング システムが使用するスロットを残します。
次のような命令:
INT #12
明示的に例外をトリガーし、ベクトルの 12 番目のプロシージャを呼び出します。システムでは、これを行うことでゼロ除算の例外をシミュレートできる場合があります
オペレーティング システムがシステム サービスにベクトル 123 を使用するとします。
INT #123
システムサービスを呼び出します。システムは、システム サービスごとに個別のベクターを予約するか、1 つを使用してディスパッチすることができます。
したがって、次のようにします:
MOVL #23, R0
INT #123
レジスタ 0 の値 23 は、割り込みハンドラにシステム サービス #23 を呼び出すように指示します。
ご覧のとおり、これにはすべてアセンブリ言語が必要です。すべてのオペレーティング システムが行うことは、高級言語から関数のように呼び出すことができるラッパーを作成することです。
これは、何が起こるかのシーケンスです:
<オール>ユーザーは、通常のパラメーターを使用して名前付きラッパーを呼び出します。ラッパーは、システム サービスのレジスタとスタックをセットアップします。
ラッパーは、システム サービスにディスパッチする例外をトリガーします。
次に、システム サービスはすべてのパラメータをチェックする必要があります。これが、システム サービスのオーバーヘッドが高い理由の 1 つです。カーネル モードで例外が発生すると、ブルー スクリーンが表示されます。システム サービスがユーザーによって提供されたバッファに書き込む必要がある場合、書き込むすべてのバイトが書き込み可能なメモリであることを確認する必要があります。
システム サービスは、必要なことは何でも行います。
システム サービスは、ハードウェア命令を実行して、例外または割り込みから復帰します。ユーザー モードに戻り、ラッパー関数に戻ります。
ラッパーは、レジスターに返されたパラメーターをアンパックする場合があります。
ラッパーは呼び出し元に戻ります。
カーネルによって処理される低レベルのカーネル コールがシステム コールです。
manページには次のように書かれています:
<ブロック引用>2 システムコール (カーネルが提供する関数)
3 ライブラリ呼び出し (プログラム ライブラリ内の関数)
画像で明確にすることができます:
そして