システムコール
各種プロセスは、プロセス生成、ハードウェアの操作など、カーネルの助けが必要なときにはシステムコールという手段によってカーネルに処理を依頼します。システムコールには次のような種類があります。 ・メモリ確保、解放
・プロセス間通信
・ネットワーク
・ファイルシステム操作
・ファイル操作(デバイスアクセス)
システムコールは、CPUの特殊な命令を実行することによって発行します。プロセスは、通常、ユーザーモードで実行していますが、カーネルに処理を依頼するためにシステムコールを発行すると、CPUにおいて割り込みというイベントが発生します。これによってCPUでは、ユーザーモードからカーネルモードに遷移して、依頼内容に応じたカーネルの処理が動き始めます。カーネル内のシステムコール処理が終了すれば、再びユーザーモードに戻ってプロセスの動作を継続します。 カーネルは、処理の冒頭で、プロセスからの要求が正当なものかどうかチェックします(たとえばシステムに存在しないような量のメモリを要求していないかどうか、など)。不正な要求であればシステムコールを失敗させます。
ユーザープロセスからシステムコールを介さずに直接CPUのモードを変更する方法はありません。(あったらカーネルが存在する意味がありません)。
システムコールは、通常の関数呼び出しとは違って、C言語などの高級言語から直接呼び出せません。アーキテクチャ依存のアセンブリコードを使って呼び出す必要があります。たとえばx86_64アーキテクチャにおいてgetppid()システムコールは次のように発行します。 mov $0x6e.%eax
syscall
ユーザプロセスは、スペシャルファイルに対するシステムコールによってハードウェアデバイスを操作することになる。
デバイスドライバは、ユーザプロセスの呼び出すread, write, poll といったシステムコールに対応するエントリポイントを実装する。