これからのレッスンでは、より理論的な概念を扱います。実践的な演習を好む場合は、遠慮なく先に進み、後でこれらのトピックに戻ってきても構いません。
Linux アーキテクチャの基本的な側面は、ユーザースペースとカーネルの分離です。しかし、なぜその両方の機能を単一のレイヤーに統合できないのでしょうか?その理由は、セキュリティと安定性であり、これらは両者が異なるモードで動作することによって達成されます。
カーネルモードとユーザードモードの違いとは
システムは、カーネルモードとユーザードモードという 2 つの明確なモードで動作します。この分離は、アプリケーションによる直接的で無制限なアクセスからシステムのハードウェアとリソースを保護するために不可欠です。
カーネルモードでは、カーネルはハードウェアに対して完全かつ無制限のアクセス権を持ちます。すべてを制御します。これは最高の特権レベルです。
ユーザードモードでは、アプリケーションは、メモリと CPU リソースの小さく安全な部分にのみアクセスが制限されます。
ユーザーアプリケーションがディスクからの読み取り、ネットワーク経由でのデータ送信、周辺機器へのアクセスなど、ハードウェアに関わる操作を実行する必要がある場合、直接それを行うことはできません。これらの操作は、カーネルモードでカーネルによって処理されなければなりません。この設計により、誤動作したプログラムや悪意のあるプログラムがシステム全体を危険にさらすことを防ぎます。例えば、スパイウェアに直接ハードウェアアクセスを許可すると、すべてのデータを読み取られたり、ウェブカメラを制御されたりする可能性があります。
保護リングと特権アクセス
これらの異なるモードは、特権レベルまたは保護リングとして説明されることがよくあります。同心円状の壁を持つ要塞を想像してください。最も内側のエリアが最も安全で、最高の権限を持っています。コンピューターの保護リングも同様に機能し、最も内側のリングが最高の特権レベルに対応します。
標準的な x86 コンピューターアーキテクチャには、主に 2 つのレベルがあります。
- リング 0: カーネルが実行される場所です。最高のカーネル特権を持ち、あらゆるシステム命令を実行でき、ハードウェアを管理するための完全な信頼が与えられます。これが特権アクセスの核心です。
- リング 3: ユーザードモードのアプリケーションが実行されるレベルです。最も特権の低いリングであり、ハードウェアへの直接アクセス権はありません。
このリングベースのセキュリティモデルにより、ユーザーアプリケーションは重要なシステムコンポーネントから隔離されます。しかし、アプリケーションが常にカーネルとは異なるモードにある場合、必要なハードウェア操作をどのように実行するのでしょうか?
システムコールとカーネル特権
ユーザードモードとカーネルモードの橋渡しをするのがシステムコールです。ユーザーアプリケーションが特権タスクを実行する必要がある場合、カーネルに代行してアクションを実行するように要求するためにシステムコールを行います。
このプロセスにより、アプリケーションはユーザードモードからカーネルモードへ一時的かつ安全に移行し、特定の制御された命令を実行できます。タスクが完了すると、システムはユーザードモードに戻ります。このメカニズムにより、アプリケーションは危険な直接的な特権アクセスを得ることなく、必要なサービスを受けることができます。