1. 序章

このチュートリアルでは、 ユーザーモードとカーネルモードを明確にします。 また、オペレーティングシステムにそのようなメカニズムがある理由についても説明します。

2. 定義

何十年も前、コンピューターが部屋の大きさだったとき、ユーザーはプログラムを非常に苦労して実行していました。時には、プログラムがコンピューターをクラッシュさせることさえありました。 コンピュータを継続的にクラッシュさせるプログラムから保護するために、2つの異なる動作モードを備えた新しいオペレーティングシステムを開発しました。

システムモードとも呼ばれるカーネルモードは、中央処理装置(CPU)の動作モードの1つです。 プロセスはカーネルモードで実行されますが、ハードウェアへの無制限のアクセスがあります。

もう1つのモードはユーザーモードです。これは、ユーザープログラムの非特権モードです。 したがって、 、プロセスがユーザーモードで実行されている場合、CPUとメモリへのアクセスが制限されます。

3. ユーザーモードとカーネルモードの必要性

OSカーネルは、セットの中で最も重要なプログラムです。 システムに必要ないくつかの重要な手順を含め、システムが起動すると、システムがメモリにロードされます。 他のプログラムは実際にはそれほど重要ではありません。 それらはユーザーに幅広いインタラクティブな体験を提供できますが、カーネルはシステムの基本的な形状と機能を決定します。

OSは、次の2つの主要な目的を達成する必要があります。

  • すべての低レベルのプログラム可能な要素にサービスを提供するハードウェアと対話します
  • コンピュータシステムのアプリケーションを実行できる環境を維持します。  これらはユーザープログラムとも呼ばれます。

MS-DOSなどの一部のオペレーティングシステムでは、ユーザープログラムがハードウェアと直接対話できます。 一方、Unixライクなオペレーティングシステムは、ユーザーが実行するプログラムから、マシンの物理的な構成に関するすべての低レベルの情報を保護します。 次の図は、最新のオペレーティングシステムにおけるユーザースペースプログラムとカーネルスペースプログラム間の一般的な相互作用を示しています。

プログラムはハードウェアリソースにアクセスするためにOSを要求する必要があります。カーネルは要求を確認し、許可を与えることを決定した場合、ユーザープログラムに代わって関連するハードウェアコンポーネントと対話します。

このメカニズムを課すために、最新のオペレーティングシステムは、特殊なハードウェア機能の可用性に依存しています。これらの機能は、ユーザープログラムが低レベルのハードウェアコンポーネントと直接対話したり、任意のメモリスペースにアクセスしたりするのを防ぐ必要があります。

実際、ハードウェアは少なくとも2つの異なるCPU実行モードを実装しています。ユーザープログラム用の非特権モードとカーネルプログラム用の特権モードです。 Unixは、これらのユーザーモードとカーネルモードを呼び出します。

オペレーティングシステムの保護リングは、カーネルモードとは別にユーザーモードを実装するための最も一般的な方法です。

3.1. 保護リング

保護リングは、データと機能を障害や悪意のある動作から保護するためのメカニズムです。 彼らには2つの主な仕事があります:

  • フォールトトレランスの改善
  • コンピュータセキュリティの提供

オペレーティングシステムが異なれば、さまざまな種類のリソース制御が提供されます。 コンピュータシステムのアーキテクチャ内では、保護リングは特権の層の2つまたは3つの階層層の1つです。 ハードウェアまたはマイクロコードレベルで個別のCPUモードを持つx86などの一部のCPUアーキテクチャでは、通常、このメカニズムが実装されています。

上の図が示すように、保護リングには、最も信頼できるリング(通常はゼロの番号)を最も信頼できないリングに配置する階層があります。ほとんどのオペレーティングシステムでは、リング0が最も特権のあるレベルです。 カーネルモードを表し、CPUやメモリなどの物理ハードウェアと相互作用します。

3.2. さまざまなオペレーティングシステムの保護リングの例

Linux、Windows、およびmacOSは、カーネル/ユーザーモードを使用する3つのオペレーティングシステムです。 ユーザースペースプログラムは、特殊な機能を実行するために、カーネルモードへのシステムコールを使用する必要があります。 OSの信頼できるコードが必要なタスクを実行し、実行をユーザースペースに戻すカーネルスペースである場合もあります。

逆に、DOSおよびその他の同様の単純なオペレーティングシステムと組み込みデバイスは、常にカーネルモードで実行されます。 これは、ドライバーをユーザープログラムとして作成できることを意味します。 この状況は、モノのインターネット(IoT)デバイスのセキュリティ問題を引き起こす可能性があります。

4. ユーザーモードからカーネルモードへの切り替え

上記では、ユーザースペースプログラムがカーネルモードと簡単に対話したり、カーネルモードに戻ったりしたくない理由を説明しました。 このアクセスにより、2つの特権モードが使用できなくなる可能性があります。

一方、プログラムがディスクから読み取れない場合や、ユーザーモードでキーボードから行を取得できない場合など、ユーザープログラムがカーネルモードに戻る必要がある場合があります。 OSはそのような操作を行うことができる唯一のソフトウェアです。

その時点で、プログラムはOSに代わってハードウェアにアクセスし、プログラムへの入力を取得するように要求する必要があります。 したがって、ユーザーモードプログラムがカーネルモードに切り替えることができるメカニズムが必要です。

このメカニズムがシステムコールです。 トラップ命令としてCPUに実装されています。 OSに新しいシステムコールを追加するには、いくつかのファイルを変更してカーネルとユーザースペースに追加する必要があります。 その後、この新しいシステムコールを使用するには、カーネルをコンパイルして起動する必要があります。

4.1. システムコール

システムコールは、カーネルモードで発生するOSルーチンを管理する特殊な関数です。 システムコールがどのように機能するかを見てみましょう。

  • OSから必要な特定のサービスを指定するために、ユーザープログラムはいくつかの値をレジスタに配置するか、引数付きのスタックフレームを生成します。
  • 次に、ユーザープログラムがトラップ命令を実行します。
  • トラップ命令はOSの一部であり、メモリ保護があります。 したがって、ユーザープログラムで変更することはできません。 また、ユーザープログラムでは読み取ることができません。
  • トラップまたはシステムコールハンドラの命令は、要求されたサービスの情報を読み取り、カーネルモードで要求を実行します。
  • システムコールが完了すると、OSはユーザーモードに戻り、システムコールを終了します。

トラップ命令は、単一の命令で異常な動作を実行し、ユーザープログラムの観点から次の命令で効果を利用できます。 実際、CPUはシステムコールハンドラーに対してカーネルモードに入り、システムコールハンドラーは作業を実行してから、ユーザーモードでプログラムに戻ります。

システムコールは、次の場合に使用できます。

  • プロセスID(pid)やスケジューラポリシーの変更などの特権情報にアクセスする必要があります
  • I/Oデバイスまたはファイルにアクセスする
  • 実行コンテキストを変更する必要があります

システムコールは、ユーザーモードが低レベルのサービスと対話するためのほとんど唯一の方法です。 たとえば、OSのスケジューラポリシーを変更する場合は、システムコールを使用してこの操作を行う必要があります。

4.2. なぜOSを信頼するのですか?

カーネルモードで動作するすべてのプログラムには、システムに対する完全な特権があります。 他に選択肢がないので、私たちはそれを信頼しなければなりません。 したがって、OS自体であるシステムソフトウェア、より具体的には、kernelとして知られるカーネルモードで実行されるOSの部分を信頼する必要があります。

5. 結論

この記事では、ユーザーモードとカーネルモードを定義しました。 なぜそのようなメカニズムが必要なのか、そしてそれがどのように実装されているのかを明らかにしようとしました。 また、システムコールについて説明し、システムコールを使用してユーザーモードからカーネルモードに切り替える方法を学習しました。