巨大なコンサート会場にいると想像してください。一般観客エリアから特別なバックステージへ移動するには、ただ歩いて行けるわけではありません。特定の警備されたドアを通過するための特別なパスが必要です。コンピューティングの世界では、システムコールがその特別なパスに相当します。
システムコールとは?
システムコール(syscalls と略されることが多い)は、ユーザー空間のプロセスがカーネルに直接サービスを要求するための手段を提供します。カーネルは、システムコール API を通じて一連のサービスを公開しています。これらのサービスは、ファイルの読み書き、メモリ管理、ネットワーク接続の処理などの操作に不可欠です。利用可能なシステムコールの数は固定されており、任意に新しいものを追加することはできません。システムは、各システムコールが一意の ID で登録されているsyscall table(システムコールテーブル)を維持しています。
Linux におけるシステムコールの仕組み
lsのようなプログラムを実行するとき、その中のコードがシステムコール linuxコマンドを直接実行するわけではありません。代わりに、ラッパーとして機能するライブラリ関数を使用します。このラッパー関数は必要なパラメータを設定し、ソフトウェア割り込み、つまり「トラップ」を発生させます。
このトラップは、プロセッサに特権のないユーザーモードから特権のあるカーネルモードへ切り替えるようシグナルを送ります。カーネルモードに入ると、システムコールハンドラが処理を引き継ぎます。ハンドラは一意の ID を使用してsyscall table内で要求された関数を検索し、それを実行します。例えば、ファイルのステータスを照会するために使用されるstat()システムコールは、このように見つけられて実行されます。カーネルがタスクを完了した後、コンテキストをユーザーモードに戻し、成功またはエラーを示すステータスコードをプロセスに返します。