カーネルモジュールはLinuxに固有のものですか、それとも一般的なメカニズムですか?

カーネルモジュールはLinuxに固有のものですか、それとも一般的なメカニズムですか?

私はオペレーティングシステムに関するTanenbaumの本にガードリングがあり、リング0がカーネルに属していることを読んだ。一般に、「カーネルモジュールはリング0のI / Oとメモリ管理を処理します」と言うことができます。それとも「カーネルモジュール」はLinuxに固有のもので、OpenBSDやMULTICSなどには適用されませんか?

答え1

Andrew Tanenbaumによって提示されたアイデアは通常、Linux(または既存のモノリシックUnixカーネル)に直接適用することはできません。あなたの質問に対する答えは、あなたが提案したものよりはるかに簡単です。 Linuxカーネルモジュールは、カーネルイメージにリンクされず、別々のファイルにコンパイルおよびリンクされたカーネルコードです。この別々のカーネルオブジェクトファイル(.ko)は、実行時に必要に応じてカーネルアドレス空間にロードできます。カーネルモジュールでコンパイルできるほとんどすべてのドライバは、コードがロードされると機能的な違いなしにカーネルイメージに静的にリンクすることができます。

モジュールコードは、他のすべてのカーネルコードと同じ権限で実行されるカーネルコードです。原則として、カーネルモジュールはすべてのカーネルコードを置き換えることができますが、それをきちんと実行するには、カーネル自体からモジュールを接続するメカニズムを提供する必要があります。

用語に関する注意:ガードリングは、Multicsオペレーティングシステムによって導入された概念です。 「リング 0」から「リング 3」までは、Intel プロセッサに固有の用語です。他のプロセッサアーキテクチャは、ユーザー/管理モードなどの他の用語を使用します。 Intelプロセッサは4つの特権レベルを提供しますが、ほとんどのオペレーティングシステムは、ユーザーレベルのコード用のリング3とカーネルコード用のリング0、つまり他のプロセッサのユーザー/管理モードをミラーリングする2つの特権のみを使用します。 (3つの特権レベルを使用するOS / 2は例外です。)

最近、ハードウェアレベルの仮想化技術が登場し、権限レベルの概念が拡張されている。たとえば、ARMアーキテクチャは、ユーザー、スーパーバイザ、ハイパーバイザーという3つの権限レベルを定義します。冗談として、Intelベースのシステムでは4つのリングが使用されました。つまり、ユーザーレベルコード用リング3、(仮想マシン)カーネルコード用リング0、ハイパーバイザーコード用リング-1、SMMモード用リング-2です。

答え2

カーネルの概念がすべてのオペレーティングシステムに適用されるわけではありません。これは一般的ですが、特定のシステムに正確にどのように適用されるかについて議論の余地があります。

プログラムが互いに分離されているマルチプログラミングシステムでは、カーネルは正確な定義を持ちます。つまり、カーネルはすべてにアクセスできるシステムの一部です。カーネルは孤立した部分ではありません。カーネルの役割は少なくとも分離メカニズムを提供することですが、はるかに多くのことができます。 Linuxを含む従来のUnixカーネルアーキテクチャでは、カーネルにはハードウェアドライバ、ネットワークプロトコル、ファイルシステムドライバなども含まれています。

ほとんどのシステムで実行されているプログラム間の分離は、ハードウェア機能(プロセッサ特権モード、メモリ管理デバイス)によって異なります。カーネルは、システム全体の権限を制御するプロセッサの最高権限モードで実行されるシステムの一部です。 x86プロセッサでは、このモードを「リング0」と呼びます。 「リング0」は一般的な概念ではなく、x86の用語です。一般的な概念は、「カーネルモード」、「特権モード」、または「スーパーバイザモード」と呼ばれます。

「カーネルモジュールがリング0のI / Oとメモリ管理を処理します」という説明は意味がありません。カーネルは全体的にメモリ管理(どのプロセスがどのメモリを所有し、どのアドレスにアクセスするかを決定するレベル)とI / O(周辺機器の内外にデータをコピーするレベル)を処理します。カーネルは、x86 プロセッサのリング 0 であるプロセッサのカーネルモードで全体的に実行されます。

カーネルモジュールは、起動後にロードされるカーネルの一部です。モジュールとスタートコードの唯一の違いは、ロードされる方法です。カーネルモジュールのコードは、起動時にロードされたカーネルコードと同じ特権レベルを持ち、同じ機能を実行できます(モジュールにロードできるすべてのコードは、起動時にイメージに含めることもできます)。カーネルモジュールは、Solaris、* BSD、Linuxなどを含む多くの最新のUnixシステムで利用できます。

関連情報