プロセスの実行を処理するために、「カーネルモード」と「ユーザーモード」という2つのモードがあることを読みました。 (Linuxカーネルを理解する、第3版。)それはLinuxによって制御されるハードウェアスイッチ(カーネル/ユーザー)ですか、それともLinuxカーネルによって提供されるソフトウェア機能ですか?
カーネルモードとユーザーモードはハードウェア機能、特にプロセッサの機能です。ミッドエンドからハイエンドのシステム(PC、フィーチャーフォン、スマートフォン、最も単純なネットワークアプライアンスを除くすべてなど)用に設計されたプロセッサには、この機能が含まれています。カーネルモードは、スーパーバイザーモード、特権モードなど、さまざまな名前で使用できます。x86(PCのプロセッサータイプ)では、「リング0」と呼ばれ、ユーザーモードは「リング3」と呼ばれます。
プロセッサは、カーネルモードかユーザーモードかを示すレジスタにビットストレージを持っています。 (これは、そのようなモードが3つ以上あるプロセッサでは1ビットを超える場合があります。)一部の操作は、カーネルモードでのみ実行できます。特に、 [ 〜#〜] mmu [〜#〜] 。さらに、ユーザーモードからカーネルモードに切り替える方法はごくわずかであり、それらはすべて、カーネルコードによって制御されるアドレスにジャンプする必要があります。これにより、カーネルモードで実行されているコードは、ユーザーモードで実行されているコードがアクセスできるメモリを制御できます。
Unixライクなオペレーティングシステム(およびプロセス分離を備えた他のほとんどのオペレーティングシステム)は、次の2つの部分に分かれています。
したがって、オペレーティングシステムは、ハードウェア機能(特権モード、MMU)を利用して、プロセス間の分離を強制します。
Microkernel ベースのオペレーティングシステムは、カーネルモードで実行されるコードが少なく、よりきめ細かいアーキテクチャを備えています。
ユーザーモードコードが直接実行できないアクション(ファイルへのアクセス、周辺機器へのアクセス、別のプロセスとの通信など)を実行する必要がある場合、 システムコール :にジャンプします。カーネルコード内の事前定義された場所。
ハードウェア周辺機器がCPUに注意を要求する必要がある場合、CPUをカーネルモードに切り替え、カーネルコードの事前定義された場所にジャンプします。これは 割り込み と呼ばれます。
「Linux」本体はカーネルのみです。オペレーティングシステムとしての「Linux」について話すとき、それはカーネルとそれとともに配布されるすべてのotherソフトウェアの混同です。 Linuxディストリビューション 。
ユーザーモードとカーネルモードの切り替えは、 システムコール を実行すると発生します。これは、 手動セクション2 に記載されている関数のいずれかです。つまり、man 2 open
のように言って結果を取得した場合、またはman creat
のようにページタイトルに(2)
サフィックスがある場合は、システムコールを確認しています。つまり、カーネルによって処理されます。
(ここでの違いは 手動セクション です。これは、システムの 標準Cライブラリ など、完全にユーザースペースに実装された関数用です。)
システムコールがそれを呼び出したユーザーコードに戻ると、そのプロセスはユーザーモードに戻ります。
Linuxカーネルは、ハードウェア機能を使用して、実行されるほとんどのプロセッサでカーネルモードとユーザーモードの区別を強制します。 Intel 保護リングスキーム はこれを行う1つの方法です。 µCLinux などの例外があります。これはMMUのない小さなプロセッサで実行され、保護リングがない場合もあります。非常に古いバージョンのUnixも、カーネル/ユーザー保護なしで実行されました。
「ユーザーモードコード」について話すときは、ほとんどすべてのプログラムにsomeが含まれますが、ほとんどの場合ユーザースペースで実行されるコードについて話します。システムコールが発生するため、常にカーネルモードで実行されるカーネルの待機に時間がかかります。